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

多形性擴展性

2013-11-15 09:48:56  來源: JSP教程 

  現在讓我們仍然返回樂器(Instrument)示例由於存在多形性所以可根據自己的需要向系統裡加入任意多的新類型同時毋需更改true()方法在一個設計良好的OOP程序中我們的大多數或者所有方法都會遵從tune()的模型而且只與基礎類接口通信我們說這樣的程序具有擴展性因為可以從通用的基礎類繼承新的數據類型從而新添一些功能如果是為了適應新類的要求那麼對基礎類接口進行操縱的方法根本不需要改變
  
  對於樂器例子假設我們在基礎類裡加入更多的方法以及一系列新類那麼會出現什麼情況呢?下面是示意圖
  

  所有這些新類都能與老類——tune()默契地工作毋需對tune()作任何調整即使tune()位於一個獨立的文件裡而將新方法添加到Instrument的接口tune()也能正確地工作不需要重新編譯下面這個程序是對上述示意圖的具體實現
  
  //: Musicjava
  // An extensible program
  import javautil*;
  
  class Instrument {
   public void play() {
  Systemoutprintln(Instrumentplay());
   }
   public String what() {
  return Instrument;
   }
   public void adjust() {}
  }
  
  class Wind extends Instrument {
   public void play() {
  Systemoutprintln(Windplay());
   }
   public String what() { return Wind; }
   public void adjust() {}
  }
  
  class Percussion extends Instrument {
   public void play() {
  Systemoutprintln(Percussionplay());
   }
   public String what() { return Percussion; }
   public void adjust() {}
  }
  
  class Stringed extends Instrument {
   public void play() {
  Systemoutprintln(Stringedplay());
   }
   public String what() { return Stringed; }
   public void adjust() {}
  }
  
  class Brass extends Wind {
   public void play() {
  Systemoutprintln(Brassplay());
   }
   public void adjust() {
  Systemoutprintln(Brassadjust());
   }
  }
  
  class Woodwind extends Wind {
   public void play() {
  Systemoutprintln(Woodwindplay());
   }
   public String what() { return Woodwind; }
  }
  
  public class Music {
   // Doesnt care about type so new types
   // added to the system still work right:
   static void tune(Instrument i) {
  //
  iplay();
   }
   static void tuneAll(Instrument[] e) {
  for(int i = ; i < e.length; i++)
   tune(e[i]);
   }
   public static void main(String[] args) {
  Instrument3[] orchestra = new Instrument3[5];
  int i = 0;
  // Upcasting during addition to the array:
  orchestra[i++] = new Wind3();
  orchestra[i++] = new Percussion3();
  orchestra[i++] = new Stringed3();
  orchestra[i++] = new Brass3();
  orchestra[i++] = new Woodwind3();
  tuneAll(orchestra);
   }
  } ///:~
  
  新方法是what()和adjust()。Tw.WingWiT.coM前者返回一個String句柄,同時返回對那個類的說明;後者使我們能對每種樂器進行調整。
  
  在main()中,當我們將某樣東西置入Instrument3數組時,就會自動上溯造型到Instrument3。
  
  可以看到,在圍繞tune()方法的其他所有代碼都發生變化的同時,tune()方法卻絲毫不受它們的影響,依然故我地正常工作。這正是利用多形性希望達到的目標。我們對代碼進行修改後,不會對程序中不應受到影響的部分造成影響。此外,我們認為多形性是一種至關重要的技術,它允許程序員“將發生改變的東西同沒有發生改變的東西區分開”。
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19159.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.