1. 程式人生 > >繼承與組合有什麼區別

繼承與組合有什麼區別

} 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,說明AB的一種,並且B的所有行為對A都有意義

eg: A=woman B=human

而 A=鴕鳥 B=鳥 (不行),因為鳥會飛,但是鴕鳥不會。

2.什麼是組合

若在邏輯上AB的“一部分”(a part of),則不允許BA派生,而是要用A和其它東西組合出B

例如眼(Eye)、鼻(Nose)、口

(Mouth)、耳(Ear)是頭(Head)的一部分,所以類Head應該由類EyeNoseMouthEar組合而成,不是派生而成。

3.繼承的優點和缺點
     優點:
                容易進行新的實現,因為其大多數可繼承而來。
                易於修改或擴充套件那些被複用的實現。
     缺點:
                破壞了封裝性,因為這會將父類的實現細節暴露給子類。
                “白盒”複用,因為父類的內部細節對於子類而言通常是可見的。
                當父類的實現更改時,子類也不得不會隨之更改。
                從父類繼承來的實現將不能在執行期間進行改變。

4.組合的優點和缺點
      優點:
                 容器類僅能通過被包含物件的介面來對其進行訪問。
                “黑盒”複用,因為被包含物件的內部細節對外是不可見。
                 封裝性好。
                 實現上的相互依賴性比較小。(被包含物件與容器物件之間的依賴關係比較少)
                 每一個類只專注於一項任務。
                 通過獲取指向其它的具有相同型別的物件引用,可以在執行期間動態地定義(物件的)組合。
      缺點:
                 導致系統中的物件過多。
                 為了能將多個不同的物件作為組合塊(composition block)來使用,必須仔細地對介面進行定義。

5.兩者的選擇

             is-a關係用繼承表達,has-a關係用組合表達

            繼承體現的是一種專門化的概念而組合則是一種組裝的概念

             另外確定是組合還是繼承,最清楚的方法之一就是詢問是否需要新類向上對映,也就是說當我們想重用原型別作為新型別的內部實現的話,我們最好自己組合,如果我們不僅想重用內部實現而且還想重用介面的話,那就用繼承。

6.法則:優先使用(物件)組合,而非(類)繼承