• 上溯造型与下溯造型的巧妙用法——《Thinking in Java》随笔022


     1 //: Transmogrify.java
     2 package cn.skyfffire;
     3 
     4 /**
     5 * @user: skyfffire
     6 * @data: 2017年3月7日 
     7 * @time: 下午7:58:23
     8 */
     9 interface Actor {
    10     void act();
    11 }
    12 
    13 class HappyActor implements Actor {
    14     @Override
    15     public void act() {
    16         System.out.println("HappyActor.");
    17     }
    18 }
    19 
    20 class SadActor implements Actor {
    21     @Override
    22     public void act() {
    23         System.out.println("SadActor");
    24     }
    25 }
    26 
    27 class Stage {
    28     Actor actor = new HappyActor();
    29     
    30     void change() {
    31         actor = new SadActor();
    32     }
    33     
    34     void go() {
    35         actor.act();
    36     }
    37 }
    38 
    39 public class Transmogrify {
    40     public static void main(String[] args) {
    41         Stage stage = new Stage();
    42         
    43         stage.go();
    44         stage.change();
    45         stage.go();
    46     }
    47 }
    48 
    49 ///:~

    可以发现:当两个类完全继承(即没有拓展接口与成员)基础类时,可以很方便地使用上溯造型进行灵活的句柄移动,但如果子类没有进行完全继承呢?

    请参考下面的例子

     1 //: RTTI.java
     2 package cn.skyfffire;
     3 
     4 /**
     5 * @user: skyfffire
     6 * @data: 2017年3月7日 
     7 * @time: 下午8:16:12
     8 */
     9 class Useful {
    10     public void f() {}
    11     public void g() {}
    12 }
    13 
    14 class MoreUseful extends Useful {
    15     @Override
    16     public void f() {}
    17     @Override
    18     public void g() {}
    19 
    20     public void u() {}
    21     public void v() {}
    22     public void w() {}
    23 }
    24 
    25 public class RTTI {
    26     public static void main(String[] args) {
    27         Useful[] x = {new Useful(), 
    28                 new MoreUseful()};
    29         
    30         x[0].f();
    31         x[1].g();
    32         
    33         ((MoreUseful)x[1]).u();// 下溯造型成功,没有违例
    34 //        ((MoreUseful)x[0]).u();此时就抛出一个违例
    35     }
    36 }
    37 
    38 ///:~

    所以在进行下溯造型的时候一定要确保方法存在。

  • 相关阅读:
    自定义分页二
    CheckBox实现跨页面多选
    正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。
    DropDownList下拉框多选
    通用查询
    AutoCAD自动加载DLL文件的方法
    软件开发(团队管理)
    正确地做事与做正确的事
    C#.NET实现邮件的发送
    多附件的上传
  • 原文地址:https://www.cnblogs.com/skyfffire/p/6516641.html
Copyright © 2020-2023  润新知