1. 程式人生 > >組合(複用類的一種方式)

組合(複用類的一種方式)

一.組合的概念
在新類裡簡單地建立原有類的物件。我們把這種方法叫作“組合”,因為新類由現有類的物件合併而成。我們只是簡單地重複利用程式碼的功能,而不是採用它的形式。
組合也就是一個類的物件是另外一個類的成員,一般的程式都有組合的意味,只不過是基本資料型別是成員變數。
例如:

class Battery 
{
    private double power = 0.0;

    public void chargeBattery(double p)
    {
        if (this.power < 1.) {
            this.power = this
.power + p; } } public boolean useBattery(double p) { if (this.power >= p) { this.power = this.power - p; return true; } else { this.power = 0.0; return false; } } } class Torch { /** * composition */
private Battery theBattery = new Battery(); /** * 10% power per hour use * warning when out of power */ public void turnOn(int hours) { boolean usable; usable = this.theBattery.useBattery( hours*0.1 ); if (usable != true) { System.out.println("No more usable, must charge!"
); } } /** * 20% power per hour charge */ public void charge(int hours) { this.theBattery.chargeBattery( hours*0.2 ); } }

上面的new為theBattery物件分配記憶體,不可或缺。

我們定義Battery類。Torch類使用了一個Battery型別的物件(theBattery)來作為資料成員。在Torch的方法中,我們通過操縱theBattery物件,來實現Battery類所提供的功能(functionality)。

我們說,一個Torch物件擁有(has-a)一個Battery物件。

二.什麼時候該用繼承,什麼時候該用組合?
以下兩條原則說明了應該如何選擇繼承與組合:

  • 如果存在一種IS-A的關係(比如Bee“是一個”Insect),並且一個類需要向另一個類暴露所有的方法介面,那麼更應該用繼承的機制。
  • 如果存在一種HAS-A的關係(比如Bee“有一個”attack功能),那麼更應該運用組合。

三.組合放在這裡只是為了記住這個名詞(因為在Thinking in java複用類中看到),其實我們經常用到但可能不知道這叫組合