上溯造型与下溯造型的巧妙用法——《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 ///:~

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

原文地址:https://www.cnblogs.com/skyfffire/p/6516641.html