那天和你提到這書中用到很多 Interface,現在認為 Interface是個有點雞肋的東西,那時也舉不出他為什麼要用 Interface的好例子。現在書在手邊,來列一下他在哪邊用到了些什麼 Interface。
另外,書的前面談組合與繼承時有些有趣的觀點,像是認為繼承破壞封裝(指父類別的更動很容易影響到子類),談到組合的不足時則認為要寫更多的程式碼(我以為這是可以靠語言的 reflaction或是 IDE的神奇功能,像是自動重構來補足?),另外一個組合的不足則是不好讀。這邊沒寫過大東西,就沒什麼話講了。
從這部份看,我猜,他使用 Interface而不直接繼承,應該是為了避免繼承的缺點,擁抱組合的靈活性,到真的要繼承時也不會有困擾。
另外手邊的是簡中版,下文章節名稱也先用中文。
先舉了 A, B與 IExample,沒啥特別的。
例子中的 Library與 Help實作方式不同,弄個 abstract類或是靠 Interface沒差。
基本是在解決多重繼承的問題。
每個 AbstractGame的子類對有個對應的 Field類,但沒有 AbstractField,大概是因為所有的 Field類都得自己實作 IField中的 protocol。
解決 proxy問題,基本上如果 XMLProxy可以問問 Product有啥 method就沒有 IProduct存在的必要XD
出現了和 Null Object一樣可愛的 Null Iterator,但如果把 Null Iterator當成父類,搞不好也可以不用 Interface。我能想到唯一的問題是語意上的,如果在 C++可以偷偷用 define避免掉吧XD 不然還是得生一個 AbstractIterator來。
這讓我想起 AS3的 DisplayObjectContainer, DisplayObjectContainer也是個 DisplayObject,但它裡面又有著 DisplayObject集合。
但 AS3自己沒有 IDisplayObject這個 Interface,反而其他的 AS3庫有把這個 Interface做出來。簡單查了下,有一說是認為 DisplayObject不太有機會被多重繼承到,所以沒有這個 Interface。
回題,書中舉了檔案系統為例,開始變複雜了,該用 JS來做看看嗎? D:
--
待續
唔,我現在覺得像是這樣的東西其實都要看實例,很難說哪個比較好
所以... XD
哈!正好我讀物件導向正是透過 actionscript, 而且我腦裡想到的跟你一樣,
只是那時候是 MovieClip 就是了。說來我覺得我們的過程好像也不少是重疊的 XDD
不過我還是覺得區分 interface 或 abstract class 實在太笨了,應該要像 scala/ruby 那樣才對
純粹的 interface 只是自找麻煩... :/ 何必區分有實作跟沒實作的差別?
假設 interface A 跟 interface B 同時都有某個 method, 然後同時使用時,那是叫誰?
說有順序可以用,那繼承或是混合(mixin)又怎麼不會有順序?