繼承是一種白箱復用,父類的內部細節對子類可見。
物件組合彼此不知道對方內部細節,成為黑箱復用。
繼承的優缺點: 1)
子類可以直接重定義父類的操作。 2)
編譯時刻決定了,無法在執行期間更改。 3)
子類要知道父類的實現細節,這樣就部分破壞了封裝性。子類和父類依賴過於緊密,父類的某些變化必然導致子類的變化。開發過程中遇到過類似的問題。這種依賴,限制了靈活性以及復用性。比如,服務體系中經常出現這樣的問題,導致**拷貝。
組合(通過獲得物件的引用而在執行時刻動態的定義)的優缺點: 1)
物件間通過介面彼此互動。 2)
物件只能通過介面訪問,不要也不能知道對方細節,這樣不會破壞封裝性。 3)
執行時刻可以使用另外乙個物件替換這個物件,提高了靈活性。 4)
物件的實現基於介面編寫,所以實現上存在較少的依賴關係。 5)
優先使用組合有助於保持每個類被封裝,並被集中在單個任務上,提高整體內聚性。類和類的層次都維持乙個較小的規模, 6)
基於物件組合的設計會有更多的物件(而又較少的類),且系統的行為依賴於物件間的關係而不是定義在某個類的內部。
理想的情況下,應該通過組合原有構件實現新的功能,而不是建立新的構件。
物件導向設計的第二個原則:優先使用物件組合,而不是類繼承。
繼承和組合的比較
繼承是一種白箱復用,父類的內部細節對子類可見。物件組合彼此不知道對方內部細節,成為黑箱復用。繼承的優缺點 1 子類可以直接重定義父類的操作。2 編譯時刻決定了,無法在執行期間更改。3 子類要知道父類的實現細節,這樣就部分破壞了封裝性。子類和父類依賴過於緊密,父類的某些變化必然導致子類的變化。開發過程...
組合與繼承的比較
類繼承 白盒復用,父類的內部實現細節對子類可見 組合 黑盒復用,物件的內部細節不可見 類繼承在編譯時刻靜態定義。且可直接使用。乙個子類重新定義一些而不是父類的全部操縱 類繼承不足 1.因為繼承在編譯時刻就定義好。所以無法在執行時改變從父類繼承的實現。2.更糟糕的是,父類至少定義了部分子類的具體表示,...
組合繼承和寄生式組合繼承
組合繼承綜合了原型鏈和盜用建構函式,解決了原型內引用值共享的問題,以及子類在例項化時不能給父類建構函式傳參的問題。缺點 呼叫了兩次父類建構函式影響效率,而且子類的原型物件上也擁有了不必要也用不上的屬性,即父類建構函式的例項屬性。這樣的話子類的例項物件如果刪除某個屬性,這個屬性仍然可以訪問到,因為它可...