当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:17:00  来源:本站整理

为什么要上溯造型[Java编程]

赞助商链接



  本文“为什么要上溯造型[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
这个程序看起来大概显得有些奇特.为什么全部人都应当有意忘掉一个对象的范例呢?举行上溯造型时,便大概产生这方面的迷惑.并且假如让tune()简单地获得一个Wind句柄,将其作为自己的自变量利用,仿佛会越发简单、直观得多.但要注意:假定那样做,就需为系统内Instrument的每种范例写一个全新的tune().假定按照前面的推论,加入Stringed(弦乐)和Brass(铜管)这两种Instrument(乐器):
//: Music2.java 
// Overloading instead of upcasting

class Note2 {
  private int value;
  private Note2(int val) { value = val; }
  public static final Note2
    middleC = new Note2(0), 
    cSharp = new Note2(1),
    cFlat = new Note2(2);
} // Etc.

class Instrument2 {
  public void play(Note2 n) {
    System.out.println("Instrument2.play()");
  }
}

class Wind2 extends Instrument2 {
  public void play(Note2 n) {
    System.out.println("Wind2.play()");
  }
}

class Stringed2 extends Instrument2 {
  public void play(Note2 n) {
    System.out.println("Stringed2.play()");
  }
}

class Brass2 extends Instrument2 {
  public void play(Note2 n) {
    System.out.println("Brass2.play()");
  }
}

public class Music2 {
  public static void tune(Wind2 i) {
    i.play(Note2.middleC);
  }
  public static void tune(Stringed2 i) {
    i.play(Note2.middleC);
  }
  public static void tune(Brass2 i) {
    i.play(Note2.middleC);
  }
  public static void main(String[] args) {
    Wind2 flute = new Wind2();
    Stringed2 violin = new Stringed2();
    Brass2 frenchHorn = new Brass2();
    tune(flute); // No upcasting
    tune(violin);
    tune(frenchHorn);
  }
} ///:~
这样做当然行得通,但却存在一个极大的弊端:必须为每种新增的Instrument2类编写与类精密相关的办法.这意味着第一次就要求多得多的编程量.今后,假定想增添一个象tune()那样的新办法大概为Instrument增添一个新范例,仍旧需求举行大量编码工作.此外,即便忘掉对自己的某个办法举行过载设置,编译器也不会提醒任何错误.这样一来,范例的整个操作历程就显得极难管理,有失控的危险.
但假定只写一个办法,将底子类作为自变量或参数利用,而不是利用那些特定的衍生类,岂不是会简单得多?也就是说,假如我们能不顾衍生类,只让自己的代码与底子类打交道,那么省下的工作量将是难以预计的.
这恰是“多形性”大显神通的地方.但是,大大都程序员(分外是有程序化编程后台的)关于多形性的工作原理仍旧显得有些陌生.
  以上是“为什么要上溯造型[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 为什么要用内部类:掌握框架
  • 为什么要上溯造型
  • 为什么要用AWT
  • <b>真的,为什么要用Hibernate?</b>
  • Java网络编程从入门到精通(15):为什么要操纵SocketAddress来
  • 为什么要在定义抽象类时操纵abstract关键字
  • <b>为什么要在operator=中返回"*this"的引用</b>
  • <b>Java多线程初学者指南(9):为什么要举行数据同步</b>
  • 为什么要进级到Win 7
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .