繼承 or 復合?

2021-08-06 05:20:34 字數 1068 閱讀 3134

django已經連續寫了很多篇,這裡先暫停一下,換換口味,實際上有了之前的簡單介紹,如果有一些web開發基礎的,已經可以開發了。後續我還會寫一些文章進行說明。

今天介紹的內容在開發中很有意義,所以拿出來和大家聊聊,希望對大家今後的工作有所幫助。

繼承是物件導向的重要概念,是依賴關係的一種,主要用來實現類之間的is-a關係,例如蘋果類可以派生自水果類,這裡蘋果是水果的一種。

復合是一種相對弱一些的依賴關係,主要用來表示has-a的關係,例如一輛汽車包含四個輪子。

如果能夠由is-a或者has-a關係嚴格判斷兩個類之間是繼承關係還是復合關係固然很好,但是有時候為了實現**復用,會有模稜兩可的情況,例如我們利用列表(list)實現乙個棧(stack)時,我們可以定義stack派生自list,然後禁用list的雙向訪問特性。也可以定義乙個stack類,其中持有乙個list物件,然後利用list物件實現stack的功能。

那麼,哪種方式更好呢?答案是優先使用復合。使用復合,兩個類之間的耦合相對較小,當被包含類發生變化時,變異的影響僅僅關係到包含該類的類,如果介面沒有變化,被包含類甚至於對包含類沒有影響。

相反,如果使用繼承,父類的變化,會影響到所有派生類,因為派生類繼承了父類的所有行為,而所有使用了派生類的其他類也會受到牽連。可見,使用繼承構建類之間的依賴關係,會引入相當大的耦合。如果使用繼承,應當保證所定義類之間有嚴格的is-a關係,另外,還要保證父類有足夠穩定的介面。

以上面的stack和list為例,如果使用繼承實現stack,一段時間後list新增了新的介面,例如檢視尾端的節點元素,由於stack為後入先出,也不應當允許檢視尾端的元素,所以應當禁用該方法,這樣,我們就需要修改stack的**,否則,會暴露出沒有意義的介面。但是,如果使用復合,由於stack內部只是包含了list的乙個物件,我們定義了stack的標準介面,list新增介面,stack並不會有任何影響,list的介面沒有辦法蔓延。

所以,當糾結於使用繼承還是復合實現**復用時,優先使用復合可以更好地保證**的低耦合,防止變異對已有**的影響。

多型 繼承 復合

1.為什麼建立的son物件可以給father類的指標賦值?賦值相容規則 可以用父類的指標指向子類的物件。inte ceson father father laowang son alloc init 在通過物件指標去呼叫方法的時候,我們不看指標是什麼型別的指標,只看指標所指向的物件。多型。多型的基礎...

復合,繼承,委託

復合其實是一種 has a 的關係,就是說乙個類裡面有其他類的物件 例如在stl標準庫的實現中,queue裡面有乙個deque template class queue size type size const void push const value type x void pop queue的...

復合優於繼承

public class testhashsetextends hashset override public boolean add e e override public boolean addall collection c public int getcount public static ...