爲何要優先使用組合而不是繼承

繼承具備以下優勢:實現新的類很是容易,由於基類的大部分功能均可以經過繼承關係自動賦予派生類;修改或者擴展繼承來的實現很是容易;只要修改父類,派生的類的行爲就同時被修改了。web

初學面向對象編程的人會認爲繼承真是一個好東西,是實現複用的最好手段。可是隨着應用的深刻就會發現繼承有不少缺點:繼承破壞封裝性。基類的不少內部細節都是對派生類可見的,所以這種複用是「白箱複用」;若是基類的實現發生改變,那麼派生類的實現也將隨之改變。這樣就致使了子類行爲的不可預知性;從基類繼承來的實現是沒法在運行期動態改變的,所以下降了應用的靈活性。
 
     繼承關係有不少缺點,若是合理使用組合則能夠有效的避免這些缺點,使用組合關係將系統對變化的適應力從靜態提高到動態,並且因爲組合將已有對象組合到了新對象中,所以新對象能夠調用已有對象的功能。因爲組合關係中各個各個對象的內部實現是隱藏的,咱們只能經過接口調用,所以咱們徹底能夠在運行期用實現了一樣接口的另一個對象來代替原對象,從而靈活實現運行期的行爲控制。並且使用合成關係有助於保持每一個類的職責的單一性,這樣類的層次體系以及類的規模都不太可能增加爲不可控制的龐然大物。所以咱們優先使用組合而不是繼承。
     固然這並非說繼承是很差的,咱們可用的類老是不夠豐富,而使用繼承複用來建立一些實用的類將會不組合來的更快,所以在系統中合理的搭配使用繼承和組合將會使你的系統強大而又牢固。
 
 
 



相關文章
相關標籤/搜索