作者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 (
[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.111.24
※ 编辑: tinlans 来自: 118.160.111.24 (07/20 15:52)
1F:推 sorryChen:非常感谢..但我还在研究中..不是全懂 128.125.87.33 07/21 04:48
2F:→ sorryChen:什麽是向下转型的地狱.. 128.125.87.33 07/21 04:50
3F:→ sorryChen:所以车应该有个"移动的"的class 128.125.87.33 07/21 04:51
4F:→ sorryChen:至於要在水里或陆上..应该事後assign 128.125.87.33 07/21 04:51
5F:→ tinlans:就是动不动就要写 dynamic_cast118.160.118.239 07/21 07:15
6F:→ tinlans:dynamic_cast<船 *>(pointer-to-交通工具)118.160.118.239 07/21 07:16
7F:→ airzone:dynamic_cast 是非常慢的,因为要爬树.. 218.169.86.137 07/21 10:57