最近看在松本行弘的程式世界這本書,裡面提到一個他大力提倡的繼承方法:mix-in。
書中討論了很多關於單一繼承、多重繼承及mix-in繼承的方法。
單一繼承:單純的繼承關係,不過限制太多有什會產生不直覺的繼承方式。
例如:
因為沒有辦法多重繼承,使得ReadWriteStream只能繼承於其中一個類別。
也因為只能繼承於單一類別,另一個ReadStream中的功能就只能用複製的方式移植到ReadWriteStream中。這樣會使得程式碼重複,而程式碼重複會產生難以維護及擴充的缺點(DRY,Don’t repeat yourself)。
多重繼承:可以同時繼承好幾的類別,就像是一個人可以同時是爸爸,也可以有老公和員工的其他身分。不過可能導致複雜的繼承關係圖及優先順序的問題。
例如:
不同於單一繼承,ReadWriteStream可以直接繼承ReadStream及WriteStream,減少程式碼的重複。
不過ReadStream及WriteStream重複的Stream的功能,可能會讓ReadWriteStream搞不清楚要用哪一個繼承下來的功能。
Mix-in:類似多重繼承,不過在第二個之後的父類別,必需是要滿足下列兩個條件的類別。
1. 不能獨自建立實體的抽象類別
2. 不能繼承自不是mix-in類別的類別
透過mix-in的方法就可以將原本多重繼承的架構簡化,並避免掉鑽石問題。
例如:
其實我重點不是要談繼承這個議題,只是想要把mix-in這種的繼承方式帶出來,因為我接下來是像要對這樣的架構作討論。
根據上面的mix-in的圖,可以發現每個子類別都繼承於Stream這個抽象的類別,在混入Read和Write這兩實作功能的類別(或稱模組)。
這樣的架構,讓我想到設計模式中的橋接模式。
橋接模式:在於將抽象與實現分離,使兩者都可以獨立地演化。這邊所謂的抽象,指的是指應用程式行為定義的演化,而實現指的是應用程式實作時,所需使用的特定API或平台。(出自良葛格筆記)
以ReadWriteStream來看,就會像下面的圖一樣。
透過橋接模式,就可以在原類別用composite的方式混入想要的功能了。
好吧,其實以上都是我自己胡思亂想的~~
沒有留言:
張貼留言