**
類的組合和繼承一樣,是軟體重用的重要方式。組合和繼承都是有效地利用已有類的資源。但二者的概念和用法不同。通過繼承建立了派生類與基類的關係,它是一種 「是(is a)」的關係,如「白貓是貓」,「黑人是人」,派生類是基類的具體化實現,是基類中的一 種。通過組合建立了成員類與組合類(或稱復合類)的關係,換句話說就是"有(has a)的關係".在功能上來看,它們都是實現系統功能重用,**復用的最常用的有效的設計技巧,都是在設計模式中的基礎結構。相信大家已了解的,類繼承允許我們根據自己的實現來覆蓋重寫父類的實現細節,父類的實現對於子類是可見的,所以我們一般稱之為白盒復用。物件持有(其實就是組合)要求建立乙個號的介面,但是整體類和部分類之間不會去關心各自的實現細節,即它們之間的實現細節是不可見的,故成為黑盒復用。繼承是在編譯時刻靜態定義的,即是靜態復用,在編譯後子類和父類的關係就已經確定了。而組合這是運用於複雜的設計,它們之間的關係是在執行時候才確定的,即在對物件沒有建立執行前,整體類是不會知道自己將持有特定介面下的那個實現類。在擴充套件方面組合比整合更具有廣泛性。繼承中父類定義了子類的部分實現,而子類中又會重寫這些實現,修改父類的實現,設計模式中認為這是一種破壞了父類的封裝性的表現。這個結構導致結果是父類實現的任何變化,必然導致子類的改變。然而組合這不會出現這種現象。物件的組合還有乙個優點就是有助於保持每個類被封裝,並被集中在單個任務上(類設計的單一原則)。這樣類的層次結構不會擴大,一般不會出現不可控的龐然大類。而類的繼承就可能出來這些問題,所以一般編碼規範都要求類的層次結構不要超過3層。組合是大型系統軟體實現即插即用時的首選方式。最後還說一句,「優先使用物件組合,而不是繼承」是物件導向設計的第二原則。在oop中,組合和繼承是擴充套件物件功能的兩大利器,gof在《設計模式》中指出oo設計的一大原則就是:優先使用物件組合,而不是類繼承。但並不是說什麼都設計都用組合,只是優先考慮組合,更不是說繼承即使不好的設計,應該用組合,應為他們之間也有各自的優勢。下面是他們之間的優缺點比比較表:
原文:關聯
關聯(association)表明某個物件可以向另乙個物件通過某種方式傳送訊息。傳送訊息的方法可以通過指標成員變數, 也可以是方法引數、區域性變數等等。例如:
class聚合聚合(aggregation)是一種特殊的聯絡,它表明了「部分」到「整體」的關係,顯著的特點就是不能包含迴圈的聯絡 (就是說,部分中不能包含整體)。如:a;
class上述**只有當子節點不會成為父節點的父節點時(即,必須是樹結構,不能是圖結構),才能稱之為聚合。node
;
從實現的角度講,聚合可以表示為:
class a class b
組合
組合(composition)跟聚合幾乎相同,唯一的區別就是「部分」不能脫離「整體」單獨存在,就是說, 「部分」的生命期不能比「整體」還要長。例如:
class從實現的角度講,組合實現的形式是:carprivate
: carburetor*itscarb
};
class a class b
c 基礎 繼承與組合!
c 程式開發中,設計孤立的模擬較容易,設計相互關聯的類卻比較難,這其中會涉及到兩個概念,乙個是繼承 inheritance 乙個是組合。因為二者有一定的相似性,往往令程式設計師混淆不清。類的組合和繼承一樣,是軟體重用的重要方式。組合和繼承都是有效地利用已有類的資源。但二者的概念和用法不同。不要覺得 ...
繼承與組合
題目描述 已知類如下 1 birthdate 生日類 含有 year,month,day 等資料成員 2 teacher 教師類 含有 num,name,等資料成員 3 professor 教授類 含有 教師類和生日類的資料成員 要求 1 通過對teacher和birthdate使用繼承和組合的方式...
繼承與組合
繼承與組合 繼承是實現類重用的重要手段,但繼承有乙個最大的壞處 就是破壞封裝,相比之下,組合也是實現類重用的重要方式,而採用組合方式來實現類重用則能提供更好的封裝性。繼承特點 繼承子類擴充套件,得到父類的屬性和方法。許可權允許的情況,子類可以直接訪問父類的屬性和方法,極大的破壞了封裝的特性 從而造成...