对于扩展继承的困惑,请大家帮忙

例如,一个很常见的多重继承的实例,如下图:


基本需求是,一个Employee可以是担当多个角色,但每次使用的激活角色只有一个。

这意味着,Employee成员里面有一个Role*的Vector容器,但是有上图可以看出Manager、SalesPerson对Role肯定是扩展继承,它们增加了Role接口没有的新方法。

事实上,当我们使用某个的角色来操作时,免不了要对保存在Employee成员里的Role*进行类型转换(例如可能需要转换为Manager*来进行操作,完成Role*不能完成的任务),这通常就给Role接口的使用带来的很大的麻烦。

然而,在各种面向对象的书籍中都再警示我们慎用继承,首先考虑组合。
但是这种情况如果没有Role接口的话,Employee成员里面要存储它所能担当的角色时,似乎麻烦更大了,尤其是需求变化角色增加的时候。

所以,请问各位大牛,有没有更好的设计方案来解决此类的扩展继承的问题?

[该贴被layzerar于2010-11-10 23:12修改过]

按照你的思路当然就是你现在的结果,不过用DCI来建模就没有那种烦恼了,无非就是一个人有两种不同的场景(管理和销售)而已。当然,你也没有说清楚业务。
[该贴被flyzb于2010-11-11 20:55修改过]

其中Role、ManagerType、SalesType为接口,Role里有所有角色共有的方法;ManagerType、SalesType里面有它们所属角色的特有方法。

我的意思是:当我用Role接口无法解决问题时,可能需要把Role接口向下转换成ManagerType或SalesType接口,有什么设计方法可以不用进行这种类型的转换,有一般性的解决方案么。

CDI是什么?google也查不到>_<,能说具体点吗

[该贴被layzerar于2010-11-11 09:39修改过]

2010年11月11日 09:34 "layzerar"的内容
当我用Role接口无法解决问题时,可能需要把Role接口向下转换成ManagerType或SalesType接口 ...

如果出现这种情况,就是误用接口,不是接口能解决你问题的。

关于你这个案例,人和角色的关系,实际是一个动态数据的关系,而不是动态类型的关系,所以,不要先从继承等OO这个角度出发,这个方向有误。


[该贴被banq于2010-11-11 12:28修改过]

感觉是Visitor模式啊(解决“免不了要对保存在Employee成员里的Role*进行类型转换”这个问题),虽然扩展起来可能麻烦点,但对于相对稳定的来说,还是可行的。若果你是第一次接Visitor模式,可以先看“静态、动态、单分派、多份派、双重分派”这个知识先。

banq,有更好的方案没?
[该贴被SpeedVan于2010-11-11 14:46修改过]
[该贴被SpeedVan于2010-11-11 14:47修改过]

谢谢大家指导,我想了一下,确实有可以不进行类型转换的方法,但接口实现起来不太漂亮。

设计模式我看了两遍了,有个大致的了解,我也考虑过使用visitor的双分派来实现,就是感觉代价好像太大。

总之,再次谢谢各位热心帮助!

谢谢banq老师提醒,看来确实应该多考虑语言之外的东西!


[该贴被layzerar于2010-11-19 18:48修改过]