組合(複用類的一種方式)
阿新 • • 發佈:2019-01-05
一.組合的概念
在新類裡簡單地建立原有類的物件。我們把這種方法叫作“組合”,因為新類由現有類的物件合併而成。我們只是簡單地重複利用程式碼的功能,而不是採用它的形式。
組合也就是一個類的物件是另外一個類的成員,一般的程式都有組合的意味,只不過是基本資料型別是成員變數。
例如:
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複用類中看到),其實我們經常用到但可能不知道這叫組合