程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java的擴展性

java的擴展性

編輯:關於JAVA

現在,讓我們仍然返回樂器(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()方法卻絲毫不受它們的影響,依然故我地正常工作。這正是利用多形性希望達到的目標。我們對代碼進行修改後,不會對程序中不應受到影響的部分造成影響。此外,我們認為多形性是一種至關重要的技術,它允許程序員“將發生改變的東西同沒有發生改變的東西區分開”。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved