Redian新闻
>
继承应该在什么场合用?
avatar
继承应该在什么场合用?# Programming - 葵花宝典
g*s
1
比如某个虚拟世界里,只有四种:普通人,盲人,聋哑人,还有既盲又聋哑人。70%普
通人,20%纯盲人,5%纯聋哑,5%盲加聋哑。
那么应该如何设计类呢?
方案一:
普通人做基类,盲人/聋哑人从普通人派生,既盲又聋哑的从盲/聋哑多继承,构成菱形
继承图。
方案二:
定义普通人类,盲属性类,聋哑属性类。在普通人类里定义两个指针分别指向盲属性类
和聋哑属性类,初始化为NULL。之所以这样做而不是用组合,是因为大部分是普通人,
这样可以减少内存使用。
方案三:
普通人做基类,盲人从普通人派生,聋哑人从盲人派生。普通人类中定义残疾属性,其
值为四种组合之一。对于纯聋哑人,虽然从盲人派生,但通过残疾属性可以识别出来。
原型实现是方案三,应该是当时开发时打补丁的结果。方案一看起来挺自然的,但是涉
及多继承,应该也不是个好方法。
目前倾向于方案二。但方案二的问题是多了两个指针字段,内存消耗比较多。而且如果
用方案一,引入虚函数的话,也有虚函数表指针的开销。
那么继承应该在什么场合用呢?感觉情况稍微一复杂,继承就不好用了。
avatar
g*g
2
继承里面,其实最重要的往往不是数据,而是能做什么。
这就是接口的好处了。
如果不能看,和不能听各为一个接口。
盲人实现不能看,聋哑人实现不能听,既盲又哑实现两者即可。

【在 g*********s 的大作中提到】
: 比如某个虚拟世界里,只有四种:普通人,盲人,聋哑人,还有既盲又聋哑人。70%普
: 通人,20%纯盲人,5%纯聋哑,5%盲加聋哑。
: 那么应该如何设计类呢?
: 方案一:
: 普通人做基类,盲人/聋哑人从普通人派生,既盲又聋哑的从盲/聋哑多继承,构成菱形
: 继承图。
: 方案二:
: 定义普通人类,盲属性类,聋哑属性类。在普通人类里定义两个指针分别指向盲属性类
: 和聋哑属性类,初始化为NULL。之所以这样做而不是用组合,是因为大部分是普通人,
: 这样可以减少内存使用。

avatar
c*t
3
Whether or not the person is blind or deaf, that's a property. Although
you could use inheritance (through marker interface), such approach is
usually bad or mostly for convenience. It also requires RTTI. Using
properties give you a lot more freedom in adding new diseases / physical
impairments and such. Basically you have two functions
setProperty (key, value);
getProperty (key);
where key is a constant such as BLIND / DEAF, where value could be boolean
such as true / false or other objects

【在 g*********s 的大作中提到】
: 比如某个虚拟世界里,只有四种:普通人,盲人,聋哑人,还有既盲又聋哑人。70%普
: 通人,20%纯盲人,5%纯聋哑,5%盲加聋哑。
: 那么应该如何设计类呢?
: 方案一:
: 普通人做基类,盲人/聋哑人从普通人派生,既盲又聋哑的从盲/聋哑多继承,构成菱形
: 继承图。
: 方案二:
: 定义普通人类,盲属性类,聋哑属性类。在普通人类里定义两个指针分别指向盲属性类
: 和聋哑属性类,初始化为NULL。之所以这样做而不是用组合,是因为大部分是普通人,
: 这样可以减少内存使用。

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。