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)、口(Mouth)、耳(Ear)是頭(Head)的一部分,所以類Head應該由類Eye、Nose、Mouth、Ear組合而成,不是派生而成 3.繼承的優點和缺點 優點: 容易進行新的實現,因為其大多數可繼承而來。 易於修改或擴展那些被復用的實現。 缺點: 破壞了封裝性,因為這會將父類的實現細節暴露給子類。 “白盒”復用,因為父類的內部細節對於子類而言通常是可見的。 當父類的實現更改時,子類也不得不會隨之更改。 從父類繼承來的實現將不能在運行期間進行改變。 4.組合的優點和缺點 優點: 容器類僅能通過被包含對象的接口來對其進行訪問。 “黑盒”復用,因為被包含對象的內部細節對外是不可見。 封裝性好。 實現上的相互依賴性比較小。(被包含對象與容器對象之間的依賴關系比較少) 每一個類只專注於一項任務。 通過獲取指向其它的具有相同類型的對象引用,可以在運行期間動態地定義(對象的)組合。 缺點: 導致系統中的對象過多。 為了能將多個不同的對象作為組合塊(composition block)來使用,必須仔細地對接口進行定義。 5.兩者的選擇 is-a關系用繼承表達,has-a關系用組合表達 繼承體現的是一種專門化的概念而組合則是一種組裝的概念 另外確定是組合還是繼承,最清楚的方法之一就是詢問是否需要新類向上映射,也就是說當我們想重用原類型作為新類型的內部實現的話,我們最好自己組合,如果我們不僅想重用內部實現而且還想重用接口的話,那就用繼承。 6.法則:優先使用(對象)組合,而非(類)繼承
個人理解:組合耦合度小,容易擴展,繼承耦合度太大了,應該優先使用組合,而非繼承。