看板 Programming 關於我們 聯絡資訊
※ 引述《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