作者tinlans ( )
看板Programming
標題Re: 繼承和多重繼承
時間Mon Jul 20 15:48:04 2009
※ 引述《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)
推 sorryChen:非常感謝..但我還在研究中..不是全懂 128.125.87.33 07/21 04:48
→ sorryChen:什麼是向下轉型的地獄.. 128.125.87.33 07/21 04:50
→ sorryChen:所以車應該有個"移動的"的class 128.125.87.33 07/21 04:51
→ sorryChen:至於要在水裡或陸上..應該事後assign 128.125.87.33 07/21 04:51
→ tinlans:就是動不動就要寫 dynamic_cast118.160.118.239 07/21 07:15
→ tinlans:dynamic_cast<船 *>(pointer-to-交通工具)118.160.118.239 07/21 07:16
→ airzone:dynamic_cast 是非常慢的,因為要爬樹.. 218.169.86.137 07/21 10:57