繼承和組合

2021-08-17 16:43:33 字數 1632 閱讀 3088

組合和繼承是物件導向中兩種**復用的方式。

組合是指在新類裡面建立原有類的物件,重複利用已有類的功能。

繼承是物件導向的主要特性之一,它允許設計人員根據其它類的實現來定義乙個類的實現。

組合和繼承都允許在新的類中設定

子物件(subobject),只是組合是顯式的,而繼承則是隱式的。組合和繼承存在著對應關係:組合中的整體類和繼承中的子類對應,組合中的區域性類和繼承中的父類對應。

例如,宣告professor(教授)類是teacher(教師)類的派生類,另有乙個類birthdate(生日),包含year、month和day等資料成員。可以將教授生日的資訊加入到professor類的宣告中。如:

class teacher    //教師類

;

class birthdate    //生日類

;

class professor : public teacher    //教授類

組合和繼承都是有效地利用已有類的資源。通過繼承建立了派生類與基類的關係,它是一種「是」的關係,如:白貓是貓;黑人是人。派生類是基類的具體化實現,是基類中的一種。通過組合建立了成員類與組合類(或稱復合類)的關係,在上例中birthdate是成員類,professor是組合類(在乙個類中又包含另乙個類的物件成員)。它們之間不是「是」的關係,而是「有」的關係。不能說教授(professor)是乙個生日(birthdate),只能說教授(professor)有乙個生日(birthdate)的屬性。

優點:1、容易進行新的實現,因為其大多數可繼承而來。

2、易於修改或擴充套件那些被復用的實現。

缺點:1、破壞了封裝性,因為這會將父類的實現細節暴露給子類。

2、白盒復用,因為父類的內部細節對於子類而言通常是可見的。

3、當父類的實現更改時,子類也不得不會隨之更改。

4、從父類繼承來的實現將不能在執行期間進行改變。

優點:1、容器類僅能通過被包含物件的介面來對其進行訪問。

2、黑盒復用,因為被包含物件的內部細節對外是不可見。

3、封裝性好。

4、實現上的相互依賴性較小。

5、每乙個類只專注於一項任務。

6、通過獲取指向其它的具有相同型別的物件引用,可以在執行期間動態地定義(物件的)組合。

缺點:1、導致系統中的物件過多。

2、為了能將多個不同的物件作為組合塊(composition block)來使用,必須仔細地對介面進行定義。

is-a關係用繼承;

has-a關係用組合。

繼承和組合都允許由已存在的型別建立新型別,兩者都是在新型別中嵌入已存在的型別的子物件。然而,如果想重用已存在型別作為新型別的內部實現的話,最好使用組合;如果想使新的型別和基類的型別相同(型別一樣可確保介面一樣),則應使用繼承。如果派生類有基類的介面,它就能向上型別轉換到這個基類。

繼承是縱向的,組合是橫向的。

繼承建立了派生類與基類的關係,它是一種「是」的關係。組合建立了成員類與組合類(或稱復合類)的關係,它是一種「有」的關係。

如果修改了成員類的部分內容,只要成員類的公用介面(如頭檔名)不變,組合類可以不修改。但組合類需要重新編譯。

注意:優先使用(物件)組合,而不是(類)繼承。

組合繼承和寄生式組合繼承

組合繼承綜合了原型鏈和盜用建構函式,解決了原型內引用值共享的問題,以及子類在例項化時不能給父類建構函式傳參的問題。缺點 呼叫了兩次父類建構函式影響效率,而且子類的原型物件上也擁有了不必要也用不上的屬性,即父類建構函式的例項屬性。這樣的話子類的例項物件如果刪除某個屬性,這個屬性仍然可以訪問到,因為它可...

繼承和組合

繼承是一種白箱復用,父類的內部細節對子類可見。物件組合彼此不知道對方內部細節,成為黑箱復用。繼承的優缺點 1 子類可以直接重定義父類的操作。2 編譯時刻決定了,無法在執行期間更改。3 子類要知道父類的實現細節,這樣就部分破壞了封裝性。子類和父類依賴過於緊密,父類的某些變化必然導致子類的變化。開發過程...

繼承和組合

1.相同點 二者都是實現類重用的重要方式。2.不同點 繼承會破壞封裝性。例 class a public void breath class b extends a class c extends a 則b,c物件則能夠訪問a中的public方法和屬性,在一定程度上破壞了類的封裝性。使用組合的方法如...