組合
通過建立乙個由其他物件組合的物件來獲得新功能的重用方法
新功能的獲得是通過呼叫組合物件的功能實現的
有時又叫聚合
例如:
乙個物件擁有或者對另外乙個物件負責並且兩個物件有相同的生命週期。(gof)
乙個物件包含另乙個物件集合
被包含物件對其他物件是不可見的並且只能從包含它的物件中訪問的特殊組合形式
組合的優缺點
優點 1. 被包含物件通過包含他們的類來訪問
2. 黑盒重用,因為被包含物件的內部細節是不可見的
3. 很好的封裝
4. 每個類專注於乙個任務
5. 通過獲得和被包含物件的型別相同的物件引用,可以在執行時動態定義組合的方式
缺點 1. 結果系統可能會包含更多的物件
2. 為了使組合時可以使用不同的物件,必須小心的定義介面
繼承通過擴充套件已實現的物件來獲得新功能的重用方法
基類有用通用的屬性和方法
子類提供更多的屬性和方法來擴充套件基類
繼承的優缺點
優點 1. 新的實現很容易,因為大部分是繼承而來的
2. 很容易修改和擴充套件已有的實現
缺點 1. 打破了封裝,因為基類向子類暴露了實現細節
2. 白盒重用,因為基類的內部細節通常對子類是可見的
3. 當父類的實現改變時可能要相應的對子類做出改變
4. 不能在執行時改變由父類繼承來的實現
由此可見,組合比繼承具有更大的靈活性和更穩定的結構,一般情況下應該優先考慮組合。只有當下列條件滿足時才考慮使用繼承:
子類是一種特殊的型別,而不只是父類的乙個角色
子類的例項不需要變成另乙個類的物件
子類擴充套件,而不是覆蓋或者使父類的功能失效
例項
第16條 復合優先於繼承
這裡的繼承是實現繼承而非介面繼承。與方法呼叫不同的是,繼承打破了封裝性 換句話說,子類依賴於其超類中特定功能的實現細節。超類的實現有可能會隨著髮型版本的不同而發生改變,如果真的發生了變化,子類可能會遭到破壞,即使他的 完全沒有改變。因此,子類必須跟著超類的更新而改變,除非超類是專門為擴充套件而設計的...
C 物件導向程式設計之復合 委託和繼承
1.復合,表示has a template calss a這裡表示 a 裡面有乙個 b,a 可以呼叫 b 寫好了的功能函式,b 裡的東西可能更多更強大,a 只取其中一些用 復合關係下的構造和析構 1 構造是由內而外進行的,在上例中,a 的構造會先呼叫 b 的預設構造函式,再執行自己的。2 析構是由外...
復合優先於繼承(重寫equals方法引出的建議)
問題復現 首先有乙個point類,重寫了equals方法 public class point override public boolean queals object o point p point o return p.x x p.y y 另有乙個擴充套件類,colorpoint繼承point...