Re: 繼承和多重繼承

看板Programming作者 ( )時間16年前 (2009/07/20 15:48), 編輯推噓1(106)
留言7則, 3人參與, 最新討論串6/7 (看更多)
※ 引述《sorryChen (陳揚和)》之銘言: : Sorry..各位高手 之前沒有看到大家熱情的回應 : 我之前用繼承是為把code的function 依照功能分層 所以每層都有實做的function : 之前沒有想好要重複使用的目的 但現在要寫一個類似的class.. : 而且會用到共同定義的functions 其實我覺得這種情形應該還滿普遍 : 但我不知道軟工上正確的作法是什麼 把交通工具拿掉也很奇怪阿.. : 所以正確的作法是應該寫個獨立的class叫交通工具 : 然後車和船 有"交通工具"的這個物件 對吧 : 這是是合成還是聚合阿 ? 我很遜阿!!! 不懂strategy pattern..正在研究當中 : 但水陸兩用車直接繼承交通工具 這樣之前寫在車和船的功能就不能重複使用了 : 有多份copy的code不會不好維護嗎 你需要的可能是一個叫「移動方式」或「可移動」的 interface, 然後設計一些像是「在陸地上移動」和「在水中移動」的 class 去實作它, 你的車或船只要用 aggregation 的方式去指向這些實作的物件就可以了, 水陸兩用車的話也能根據地形變換移動方式, 這樣就不需要什麼叫「交通工具」的 class, 用繼承樹來做功能分層的出發點是對的, 但是這種樹狀結構應該用在行為類別上而不是 client code 直接操作的類別上, client code 直接操作的類別只要透過 composition 或 aggregation 去組裝就行了, 否則你很可能掉進需要不斷向下轉型的地獄中。 如果你的需求真的是需要以多型的方式去存取「交通工具」, 比方說讓「移動」這個 method 留在交通工具這一層, 讓你的 client code 能移動任何交通工具而不需要知道它實際上是什麼交通工具, 那留著「交通工具」這類別是無妨, 但不要把行為寫死在裡面, 還是要照上面講的分出來, 把移動的責任 delegate 給負責移動的行為物件。 -- Ling-hua Tseng (uranus@tinlans.org) 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.111.24 ※ 編輯: tinlans 來自: 118.160.111.24 (07/20 15:52)

07/21 04:48, , 1F
非常感謝..但我還在研究中..不是全懂
07/21 04:48, 1F

07/21 04:50, , 2F
什麼是向下轉型的地獄..
07/21 04:50, 2F

07/21 04:51, , 3F
所以車應該有個"移動的"的class
07/21 04:51, 3F

07/21 04:51, , 4F
至於要在水裡或陸上..應該事後assign
07/21 04:51, 4F

07/21 07:15, , 5F
就是動不動就要寫 dynamic_cast
07/21 07:15, 5F

07/21 07:16, , 6F
dynamic_cast<船 *>(pointer-to-交通工具)
07/21 07:16, 6F

07/21 10:57, , 7F
dynamic_cast 是非常慢的,因為要爬樹..
07/21 10:57, 7F
文章代碼(AID): #1AP24v07 (Programming)
討論串 (同標題文章)
文章代碼(AID): #1AP24v07 (Programming)