繼承或聚合

這是在 MSDN 論壇討論一個問題後的小感想。

        這是在 MSDN 論壇討論一個問題後的小感想。

 

 

        使用物件導向程式語言的開發者難免都會用到繼承,通常初學者的書籍內容都會強調繼承對於程式碼重用的觀點,這個觀點基本上沒有錯,但是忽略了另一個對於繼承的重大意義是『多型』。我們在做架構設計的時候有一條重要的規則『倚賴抽象而非倚賴實做』,當然這是指需要多型的狀況,並非完全甚麼阿貓阿狗都不能倚賴實做類別;換句話說不需要多型的狀況下,使用繼承就很有可能是誤用。

 

 

        舉個例子來說好了,如果你的自訂類別繼承鍊是很單一的,也就是構想中 A 只能給 B 繼承,B 只能給 C 繼承,然後又不希望讓外部的組件可以使用 A 與 B ,這種設計概念已經完全排除在 C 這一子代使用多型的可能性 (但 C 的子代就可以應用到多型,除非你把 C 搞成 sealed class);只能猜測這麼設計的原因只是感覺『我有在重用程式碼』,不過這對我來講是個很怪異的設計方式,因為基本上用到繼承時,多型的應用是跑不掉的。就上述 ABC 這三個類別的關係考慮起來,聚合應該是比繼承要來得適合的多,就是將 A 與 B 設計成 internal ,而由組件內的 C 類別以 has-it 的關係來使用 A、B 類別。

 

 

        設計架構不僅僅是程式語言和框架使用的問題而已,要由需求去觀察與分析,才能應用到正確的技術,就只是想聊聊這件小事而已。