熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

為什麼要上溯造型

2013-11-15 11:42:30  來源: JSP教程 

  這個程序看起來也許顯得有些奇怪為什麼所有人都應該有意忘記一個對象的類型呢?進行上溯造型時就可能產生這方面的疑惑而且如果讓tune()簡單地取得一個Wind句柄將其作為自己的自變量使用似乎會更加簡單直觀得多但要注意假如那樣做就需為系統內Instrument的每種類型寫一個全新的tune()假設按照前面的推論加入Stringed(弦樂)和Brass(銅管)這兩種Instrument(樂器)
  
  //: Musicjava
  // 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) {
    Systemoutprintln(Instrumentplay());
   }
  }
  
  class Wind extends Instrument {
   public void play(Note n) {
    Systemoutprintln(Windplay());
   }
  }
  
  class Stringed extends Instrument {
   public void play(Note n) {
    Systemoutprintln(Stringedplay());
   }
  }
  
  class Brass extends Instrument {
   public void play(Note n) {
    Systemoutprintln(Brassplay());
   }
  }
  
  public class Music {
   public static void tune(Wind i) {
    iplay(NotemiddleC);
   }
   public static void tune(Stringed i) {
    iplay(NotemiddleC);
   }
   public static void tune(Brass i) {
    iplay(NotemiddleC);
   }
   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添加一個新類型仍然需要進行大量編碼工作此外即使忘記對自己的某個方法進行過載設置編譯器也不會提示任何錯誤這樣一來類型的整個操作過程就顯得極難管理有失控的危險
  
  但假如只寫一個方法將基礎類作為自變量或參數使用而不是使用那些特定的衍生類豈不是會簡單得多?也就是說如果我們能不顧衍生類只讓自己的代碼與基礎類打交道那麼省下的工作量將是難以估計的
  
  這正是多形性大顯身手的地方然而大多數程序員(特別是有程序化編程背景的)對於多形性的工作原理仍然顯得有些生疏
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19474.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.