我想知道多重分派的概念(即内置支持,就好像虚拟方法的动态分派也扩展到方法的参数一样)是否应该包含在面向对象的语言中,如果它对性能的影响是微不足道。
问题
考虑以下场景:我有一个——不一定是扁平的——包含动物类型的类层次结构。在我的代码中的不同位置,我想对动物对象执行一些操作。我不关心,也无法控制如何获得这个对象引用。我可能会通过遍历动物列表遇到它,或者它可能作为方法的参数之一提供给我。我要执行的操作应该根据给定动物的运行时类型进行专门化。此类行动的示例包括:
- 为动物构建一个视图模型,以便在 GUI 中显示它。
- 构造一个表示这种动物的数据对象(稍后存储到数据库中)。
- 给动物喂一些食物,但根据动物的类型给予不同种类的食物(什么对它更健康)
所有这些例子都在动物对象的公共 API 上操作,但它们所做的不是动物自己的事情,因此不能放入动物本身。
解决方案
一种“解决方案”是执行类型检查。但是这种方法容易出错并且使用反射特性,这(在我看来)几乎总是表明设计不好。类型应该只是一个编译时概念。
另一种解决方案是“滥用”(某种程度)访问者模式来模仿双重调度。但这需要我改变我的动物以接受访客。
我相信还有其他方法。另外,扩展的问题要解决:如果有新类型的动物加入聚会,需要调整多少代码位置,如何可靠地找到它们?
问题
那么,鉴于这些要求,多重分派不应该是任何设计良好的面向对象语言的一个组成部分吗?
使外部(不仅仅是内部)动作依赖于给定对象的动态类型不是很自然吗?
此致!