摘要:Ruby 利用 Mix-in 實現多重繼承
最近在「松本行弘的程式世界」這本書看到了一個Mix-in的概念,讓我重新想了一下多重繼承這件事,以前看過的東西總是提到多重繼承的缺點,告訴我們要避開多重繼承,而C#和Java更是直接規定只能單一繼承,而它們解決多重繼承的方法就是利用Interface,但這樣造成的結果就是系統有一大堆的Interface,這樣的做法的確讓設計看起來切的很乾淨、很漂亮,但程式碼就是較冗長。舉例來說,一般人可能同時有兩個身份,公司的員工和爸爸,在單一繼承的語言那就得把員工和爸爸分別定為interface,然後在人的class中去implement它們的定義,或是在人的class中去用實作這兩個interface的類別,不論是哪種方式,總是沒有多重繼承來的方便。
在Ruby中提出了一個Mix-in的概念,這並不是新的概念,只是Ruby特別強調這點而己,只要是支援多重繼承的語言都可以套用這概念。Ruby的程式其實也只能單一繼承,但它提供了一個module的定義,來支援多重繼承,程式碼如下:
執行結果:
上面程式定義了兩個模組「爸爸」和「員工」,另外定義了一個class Eric, 它include 了前面定義的兩個module,因此Eric這個人是位爸爸,也是某個公司的員工,他可以呼叫giveAllowance 也可以呼叫doWork,Ruby用這個方式來達到多重繼承。這樣的設計比多重繼承好的地方在於,它還是單一繼承的,設計物件時還是要慎重的考慮繼承這個問題,不會胡亂的繼承一大堆類別,而真的需要多重繼承時,就使用include module,這樣的語法比起用interface 簡潔多了,這是Ruby的優點,當然不可否認用Interface還是比較有彈性,抽換class非常方便,但我想這應該算是種trade-off吧!
我在了解Mix-in 這概念時,讓我想了很多,我之前也覺得單一繼承才是王道,多重繼承會帶來災難,但仔細想想,多重繼承還是有它的優點,利用module這招來享受繼承的好處還真是聰明呀!
ruby 程式碼:people.zip
執行指令,用command line到程式的目錄下,輸入:ruby people.rb