OOAD 板


LINE

※ [本文轉錄自 Programming 看板] 作者: tinlans ( ) 看板: Programming 標題: Re: Inheritance (繼承) 時間: Wed Nov 19 11:00:04 2008 ※ 引述《sorryChen (陳揚和)》之銘言: : 其實我不懂什麼時候才真正應該用繼承.. : 我的用法只是把繼承structuralize我的code. 重構 (refactoring) 上也常單純是把繼承拿來這樣用, 其實也沒有什麼不對, 這個看重構的書就會看到一大堆類似的例子。 : 比如說我要設計一台跑車的class. : 我就先設計"交通工具"此class..再設計車這個class 繼承交通工具 : 在設計"跑車"繼承"車", 雖然其實所有的class都是我寫的 : 而且目前我只需要跑車.. 這個物件 但因為這個物件有許多 : memeber function 和 variables 我是靠繼承來把code在功能上 : 分的比較清楚..我還使用多重繼承 來讓一個class有多個class的member : 和function. 你的目的顯然是 reuse 已經撰寫過的 code, 但是 reuse 已經寫過的 code 並不是非繼承不可, 一般 OO 的書會建議你盡量使用合成 (composition) 取代繼承, 也比較提倡以責任委派 (delegation) 取代繼承。 你的狀況是需要把「行為」本身抽離出來 (就是你想 reuse 的 member functions), 建立一個或一組行為家族的繼承體系, 車子本身負擔的責任就不再包含這些被你抽離的行為, 而是將責任委派給行為物件。 譬如代表 A 類行為繼承體系裡的 base class 是 BehaviorA, 程式碼就可以寫成下面這樣: class Car { public: void setBehavior(BehaviorA *behaviorObj) { behaviorObj_ = behaviorObj; } void doSomething() { behaviorObj_->doSomething(); } private: BehaviorA *behaviorObj_; }; Car::doSomething() 做的事情就很單純是把任務委派給其它物件, 它本身並不會做任何事情, 至於委派給什麼物件有很多做法, 這裡的做法是讓 Car 和 BehaviorA 家族裡的某物件產生「關聯」, 而建立這種關聯性的方式是採用「合成」的方式, 也就是將 BehaviorA 成為 Car 的一個 data member。 在 OO 的術語裡面還會區分聚合 (aggregation) 跟合成, 像是上面的寫法其實應該叫做聚合, 因為 Car 不主掌 BehaviorA 家族物件的生命週期, 近代 C++ 會以 shared_ptr<BehaviorA> 來更明確的表現聚合概念; 如果你想明確的表現合成概念, 其中一種方法就是在 Car 的建構子裡產生 BehaviorA 家族裡的物件, 然後在解構子裡明確的把它 delete 掉。 : 現在被說這樣做很不好, 誤解了inheritance的真意 : 而且能盡量不用繼承最好...我想版友們一定會叫我去看書 也不是不用最好, 只是如果用的是 public 就要遵循 Liskov Substitution Principle, 否則 user 用起來感覺會很不直覺, 比方說你讓正方形繼承矩形看似合理, 但是可以考慮下面的例子: Rectangle *shape = makeRectangle(); // 任意產生矩形「家族」的物件 int originalHeight = shape->height(); shape->setWidth(10); assert(shape->height() == originalHeight); 如果正方形也被歸類在矩形家族裡, 那麼上述的 assert 就有可能發生失敗, 這是因為正方形的 setWidth() 做的事情比矩形保證的還多, 造成家族物件行為上的不一致, 這種狀況就是違反 LSP 的其中一個例子。 當然你高興用 private 或 protected 繼承就不會有這個問題, 不過你將來很可能會遇到語言無法提供「動態繼承」的問題, 也就是說物件之間的繼承關係無法在 runtime 切斷和重新建立, 這時也只有合成和委派能達成相同的目的。 LSP 只有在純 OO 程式才有意義, 如果你是要搭 generic programming 之類的 paradigm 那又是另一回事, 在那邊的世界裡違背 LSP 的 public 繼承, 以及 OO 領域很不喜歡的多重繼承會變得隨處可見, 詳情可參考 Modern C++ Design 之類的書籍。 : 我看來看去還是看不懂為什麼不好 : 請原諒我沒看過pattern design但是有沒有大師可以指點一下 書還是要讀, 不然可能很多東西會解釋不完。 -- Ling-hua Tseng ([email protected]) Department of Computer Science, National Tsing-Hua University Interesting: C++, Compiler, PL/PD, OS, VM, Large-scale software design Researching: Software pipelining for VLIW architectures Homepage: https://www.tinlans.org --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.160.110.248
1F:推 sorryChen:感謝大師的指點 128.125.87.33 11/19 16:57
2F:推 sorryChen:再次拜謝 128.125.87.33 11/19 17:31
--



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 128.125.87.33







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:iOS站內搜尋

TOP