国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

多形性擴展性

2019-11-18 13:21:40
字體:
來源:轉載
供稿:網友

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


  所有這些新類都能與老類——tune()默契地工作,毋需對tune()作任何調整。即使tune()位于一個獨立的文件里,而將新方法添加到Instrument的接口,tune()也能正確地工作,不需要重新編譯。下面這個程序是對上述示意圖的具體實現:
  
  //: Music3.java
  // An extensible PRogram
  import java.util.*;
  
  class Instrument3 {
   public void play() {
  System.out.println("Instrument3.play()");
   }
   public String what() {
  return "Instrument3";
   }
   public void adjust() {}
  }
  
  class Wind3 extends Instrument3 {
   public void play() {
  System.out.println("Wind3.play()");
   }
   public String what() { return "Wind3"; }
   public void adjust() {}
  }
  
  class Percussion3 extends Instrument3 {
   public void play() {
  System.out.println("Percussion3.play()");
   }
   public String what() { return "Percussion3"; }
   public void adjust() {}
  }
  
  class Stringed3 extends Instrument3 {
   public void play() {
  System.out.println("Stringed3.play()");
   }
   public String what() { return "Stringed3"; }
   public void adjust() {}
  }
  
  class Brass3 extends Wind3 {
   public void play() {
  System.out.println("Brass3.play()");
   }
   public void adjust() {
  System.out.println("Brass3.adjust()");
   }
  }
  
  class Woodwind3 extends Wind3 {
   public void play() {
  System.out.println("Woodwind3.play()");
   }
   public String what() { return "Woodwind3"; }
  }
  
  public class Music3 {
   // Doesn't care about type, so new types
   // added to the system still work right:
   static void tune(Instrument3 i) {
  // ...
  i.play();
   }
   static void tuneAll(Instrument3[] e) {
  for(int i = 0; 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()。前者返回一個String句柄,同時返回對那個類的說明;后者使我們能對每種樂器進行調整。
  
  在main()中,當我們將某樣東西置入Instrument3數組時,就會自動上溯造型到Instrument3。
  
  可以看到,在圍繞tune()方法的其他所有代碼都發生變化的同時,tune()方法卻絲毫不受它們的影響,依然故我地正常工作。這正是利用多形性希望達到的目標。我們對代碼進行修改后,不會對程序中不應受到影響的部分造成影響。此外,我們認為多形性是一種至關重要的技術,它答應程序員“將發生改變的東西同沒有發生改變的東西區分開”。

上一篇:final方法

下一篇:產生正確的行為

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 武胜县| 元阳县| 白城市| 县级市| 永丰县| 马关县| 平果县| 克拉玛依市| 新巴尔虎左旗| 青海省| 东丰县| 贵港市| 赣榆县| 信宜市| 元朗区| 双辽市| 星座| 东山县| 福清市| 四平市| 岐山县| 衡水市| 海门市| 太湖县| 玛纳斯县| 密云县| 县级市| 新晃| 正蓝旗| 大理市| 昌图县| 清水河县| 河北省| 榆社县| 融水| 射洪县| 社旗县| 花莲县| 石首市| 正安县| 铁岭县|