繼承與組合有什麼區別
} class Tire{
}
class Car extends Verhicle{
private Tire t=new Tire();
}
既然繼承和組合都可以實現程式碼的重用,那麼在實際使用的時候又該如何選擇呢?一般情況下,遵循以下兩點原則。
(1) 除非兩個類之間是“is-a”的關係,否則不要輕易地使用繼承,不要單純地為了實現程式碼的重用而使用繼承,因為過多地使用繼承會破壞程式碼的可維護性,當父類被修改的時候,會影響到所有繼承自它的子類,從而增加程式的維護難度與成本。
(2) 不要僅僅為了實現多型而使用繼承,如果類之間沒有“is-a”的關係。可以通過實現介面與組合的方式來達到相同的目的。設計模式中的策略模式可以很好的說明這一點,採用介面與組合的方式比採用繼承的方式具有更好的可擴充套件性。
由於Java語言只支援單繼承,如果想同時繼承兩個類或多個類,在Java中是無法直接實現的。同時,在Java語言中,如果繼承使用太多,也會讓一個class裡面的內容變得臃腫不堪。所以,在Java語言中,能使用組合的時候儘量不要使用繼承。
繼承與組合概念、區別及優缺點
1.什麼是繼承
A繼承B,說明A是B的一種,並且B的所有行為對A都有意義
eg: A=woman B=human
而 A=鴕鳥 B=鳥 (不行),因為鳥會飛,但是鴕鳥不會。
2.什麼是組合
若在邏輯上A是B的“一部分”(a part of),則不允許B從A派生,而是要用A和其它東西組合出B。
例如眼(Eye)、鼻(Nose)、口
3.繼承的優點和缺點
優點:
容易進行新的實現,因為其大多數可繼承而來。
易於修改或擴充套件那些被複用的實現。
缺點:
破壞了封裝性,因為這會將父類的實現細節暴露給子類。
“白盒”複用,因為父類的內部細節對於子類而言通常是可見的。
當父類的實現更改時,子類也不得不會隨之更改。
從父類繼承來的實現將不能在執行期間進行改變。
4.組合的優點和缺點
優點:
容器類僅能通過被包含物件的介面來對其進行訪問。
“黑盒”複用,因為被包含物件的內部細節對外是不可見。
封裝性好。
實現上的相互依賴性比較小。(被包含物件與容器物件之間的依賴關係比較少)
每一個類只專注於一項任務。
通過獲取指向其它的具有相同型別的物件引用,可以在執行期間動態地定義(物件的)組合。
缺點:
導致系統中的物件過多。
為了能將多個不同的物件作為組合塊(composition block)來使用,必須仔細地對介面進行定義。
5.兩者的選擇
is-a關係用繼承表達,has-a關係用組合表達
繼承體現的是一種專門化的概念而組合則是一種組裝的概念
另外確定是組合還是繼承,最清楚的方法之一就是詢問是否需要新類向上對映,也就是說當我們想重用原型別作為新型別的內部實現的話,我們最好自己組合,如果我們不僅想重用內部實現而且還想重用介面的話,那就用繼承。
6.法則:優先使用(物件)組合,而非(類)繼承