zoukankan      html  css  js  c++  java
  • 上溯造型与下溯造型的巧妙用法——《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 ///:~

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

  • 相关阅读:
    pip3 install的时候报错timed out
    小程序经验
    require()  module.export    Object.keys()
    canvas
    弹框时出现灰色背景
    template模板的使用方法
    javascript中array常用属性方法
    封装数据请求
    wx 参数传值
    ELF文件格式分析
  • 原文地址:https://www.cnblogs.com/skyfffire/p/6516641.html
Copyright © 2011-2022 走看看