為什麼要優先使用組合 而不是繼承?

2021-07-02 19:54:39 字數 637 閱讀 5083

繼承具有如下優點:

實現新的類非常容易,因為基類的大部分功能都可以通過繼承關係自動賦予派生類;修改或者擴充套件繼承來的實現非常容易;只要修改父類,派生的類的行為就同時被修改了。初學物件導向程式設計的人會認為繼承真是乙個好東西,是實

現復用的最好手段。但是隨著應用的深入就會發現繼承有很多缺點:繼承破壞封裝性。基類的很多內部細節都是對派生類可見的,因此這種復用是「白箱復用」;如果基類的實現發生改變,那麼派生類的實現也將隨之改變。這樣就導致了子類行為的不可預知性;從基類繼承來的實現是無法在執行期動態改變的,因此降低了應用的靈活性。

繼承關係有很多缺點,如果合理使用組合則可以有效的避免這些缺點,使用組合關係將系統對變化的適應力從靜態提公升到動態,而且由於組合將已有物件組合到了新物件中,因此新物件可以呼叫已有物件的功能。由於組合關係中各個物件的內部實現是隱藏的,我們只能通過介面呼叫,因此我們完全可以在執行期用實現了同樣介面的另外乙個物件來代替原物件,從而靈活實現執行期的行為控制。而且使用合成關係有助於保持每個類的職責的單一性,這樣類的層次體系以及類的

規模都不太可能增長為不可控制的龐然大物。因此我們優先使用組合而不是繼承。

當然這並不是說繼承是不好的,我們可用的類總是不夠豐富,而使用繼承復用來建立一些實用的類將會比組合來的更快,因此在系統中合理的搭配使用繼承和組合將會使你的系統強大而又牢固。

為什麼優先使用組合而不是繼承

繼承具有如下優點 實現新的類非常容易,因為基類的大部分功能都可以通過繼承關係自動賦予派生類 修改或者擴充套件繼承來的實現非常容易 只要修改父類,派生的類的行為就同時被修改了。初學物件導向程式設計的人會認為繼承真是乙個好東西,是實現復用的最好手段。但是隨著應用的深入就會發現繼承有很多缺點 繼承破壞封裝...

為什麼是裝飾模式而不是繼承

對於是否需要快取算乙個需求的話 兩種情況 讀取的流的型別是了另乙個需求 兩種情況 輸入還是輸出又是乙個需求如果採用繼承的話 兩種情況 需要的類有 帶快取 位元組型 輸入流 帶快取 位元組型 輸出流 帶快取 字元型 輸入流 帶快取 字元型 輸出流 不帶快取 位元組型 輸入流 不帶快取 位元組型 輸出流...

spring為什麼要注入介面,而不是實現類

首先說明,注入的物件確實為實現類的物件。並不是實現類的 物件,注入並不涉及 如果只是單純注入是可以用實現類接收注入物件的,但是往往開發中會對實現類做增強,如事務,日誌等,實現增強的aop技術是通過動態 實現的,而spring預設是jdk動態 對實現類物件做增強得到的增強類與實現類是兄弟關係,所以不能...