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