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

到底選擇合成還是繼承

編輯:關於JAVA

無論合成還是繼承,都允許我們將子對象置於自己的新類中。大家或許會奇怪兩者間的差異,以及到底該如何選擇。
如果想利用新類內部一個現有類的特性,而不想使用它的接口,通常應選擇合成。也就是說,我們可嵌入一個對象,使自己能用它實現新類的特性。但新類的用戶會看到我們已定義的接口,而不是來自嵌入對象的接口。考慮到這種效果,我們需在新類裡嵌入現有類的private對象。
有些時候,我們想讓類用戶直接訪問新類的合成。也就是說,需要將成員對象的屬性變為public。成員對象會將自身隱藏起來,所以這是一種安全的做法。而且在用戶知道我們准備合成一系列組件時,接口就更容易理解。car(汽車)對象便是一個很好的例子:
 

//: Car.java
// Composition with public objects

class Engine {
  public void start() {}
  public void rev() {}
  public void stop() {}
}

class Wheel {
  public void inflate(int psi) {}
}

class Window {
  public void rollup() {}
  public void rolldown() {}
}

class Door {
  public Window window = new Window();
  public void open() {}
  public void close() {}
}

public class Car {
  public Engine engine = new Engine();
  public Wheel[] wheel = new Wheel[4];
  public Door left = new Door(),
       right = new Door(); // 2-door
  Car() {
    for(int i = 0; i < 4; i++)
      wheel[i] = new Wheel();
  }
  public static void main(String[] args) {
    Car car = new Car();
    car.left.window.rollup();
    car.wheel[0].inflate(72);
  }
} ///:~

由於汽車的裝配是故障分析時需要考慮的一項因素(並非只是基礎設計簡單的一部分),所以有助於客戶程序員理解如何使用類,而且類創建者的編程復雜程度也會大幅度降低。
如選擇繼承,就需要取得一個現成的類,並制作它的一個特殊版本。通常,這意味著我們准備使用一個常規用途的類,並根據特定的需求對其進行定制。只需稍加想象,就知道自己不能用一個車輛對象來合成一輛汽車——汽車並不“包含”車輛;相反,它“屬於”車輛的一種類別。“屬於”關系是用繼承來表達的,而“包含”關系是用合成來表達的。

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