c++ 繼承和組合的區別


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.法則:優先使用(對象)組合,而非(類)繼承

個人理解:組合耦合度小,容易擴展,繼承耦合度太大了,應該優先使用組合,而非繼承。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM