組合和繼承有什麼區別?
阿新 • • 發佈:2018-12-02
組合和繼承是面向物件中兩種程式碼複用的方式。
1.組合定義
在新類裡面建立原有類的物件,重複利用已有類的功能。(has-a關係)
2.繼承定義
可以使用現有類的功能,並且在無需重複編寫原有類的情況下對原有類進行功能上的擴充套件。(is-a關係)
3.例項比較
- Vehicle表示交通工具物件
- Car表示汽車物件
- Tire表示輪胎物件
/**
*繼承
*/
class Vehicle{
}
class Car entends Vehicle{
}
/**
*組合
*/
class Tire{
}
class Car entends Vehicle{
private Tire t = new Tire();
}
4.兩種方式的選擇
- 除非兩個類之間是“is-a”的關係,否則不要輕易的使用繼承,不要單純的為了實現程式碼的重用而使用繼承,因為過多的使用繼承會破壞程式碼的可維護性,當父類被修改時,會影響到所有繼承自它的子類,從而增加程式的維護難度和成本。
- 不要僅僅為了實現多型而使用繼承,如果類之間沒有“is-a”的關係,可以通過實現介面與組合的方式來達到相同的目的。設計模式中的策略模式可以很好的說明這一點,採用介面與組合的方式比採用繼承的方式具有更好的可擴充套件性。
- 在Java語言中,能使用組合就儘量不要使用繼承。