知识大全 为什么要上溯造型

Posted 自变量

篇首语:其实最美好的日子就是,我对你闹,你对我笑。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 为什么要上溯造型相关的知识,希望对你有一定的参考价值。

  这个程序看起来也许显得有些奇怪 为什么所有人都应该有意忘记一个对象的类型呢?进行上溯造型时 就可能产生这方面的疑惑 而且如果让tune()简单地取得一个Wind句柄 将其作为自己的自变量使用 似乎会更加简单 直观得多 但要注意 假如那样做 就需为系统内Instrument的每种类型写一个全新的tune() 假设按照前面的推论 加入Stringed(弦乐)和Brass(铜管)这两种Instrument(乐器)     //: Music java   // Overloading instead of upcasting    class Note    private int value;   private Note (int val) value = val;    public static final Note     middleC = new Note ( )     cSharp = new Note ( )     cFlat = new Note ( );   // Etc     class Instrument    public void play(Note n)     System out println( Instrument play() );         class Wind extends Instrument    public void play(Note n)     System out println( Wind play() );         class Stringed extends Instrument    public void play(Note n)     System out println( Stringed play() );         class Brass extends Instrument    public void play(Note n)     System out println( Brass play() );         public class Music    public static void tune(Wind i)     i play(Note middleC);      public static void tune(Stringed i)     i play(Note middleC);      public static void tune(Brass i)     i play(Note middleC);      public static void main(String[] args)     Wind flute = new Wind ();    Stringed violin = new Stringed ();    Brass frenchHorn = new Brass ();    tune(flute); // No upcasting    tune(violin);    tune(frenchHorn);      ///:~    这样做当然行得通 但却存在一个极大的弊端 必须为每种新增的Instrument 类编写与类紧密相关的方法 这意味着第一次就要求多得多的编程量 以后 假如想添加一个象tune()那样的新方法或者为Instrument添加一个新类型 仍然需要进行大量编码工作 此外 即使忘记对自己的某个方法进行过载设置 编译器也不会提示任何错误 这样一来 类型的整个操作过程就显得极难管理 有失控的危险     但假如只写一个方法 将基础类作为自变量或参数使用 而不是使用那些特定的衍生类 岂不是会简单得多?也就是说 如果我们能不顾衍生类 只让自己的代码与基础类打交道 那么省下的工作量将是难以估计的     这正是 多形性 大显身手的地方 然而 大多数程序员(特别是有程序化编程背景的)对于多形性的工作原理仍然显得有些生疏 cha138/Article/program/Java/JSP/201311/19474

相关参考