问题:
考虑以下情况:我有一个不一定是平面的类层次结构,其中包含动物类型。在我的代码的不同位置,我想对动物对象执行一些操作。我不关心,也不能控制,如何获取此对象引用。我可能通过遍历动物列表来遇到它,或者它可能被作为方法参数之一给予我。我想要执行的操作应根据给定动物的运行时类型进行特殊化。这些操作的示例包括:
- 构建动物的视图模型,以便在GUI中呈现它。 - 构建表示此类型动物的数据对象(稍后存储到DB中)。 - 用某些食物喂动物,但根据动物的类型给出不同种类的食物(对它更健康的是什么)。
所有这些示例都在动物对象的公共API上操作,但它们所做的事情不是动物自己的业务,因此无法放入动物本身。
解决方案:
一种“解决方案”是执行类型检查。但是,这种方法容易出错,并使用反射功能(在我看来)几乎总是表明设计不良。类型应仅为编译时概念。
另一种解决方案是“滥用”(有点像)访问者模式来模拟双重调度。但这将要求我更改我的动物以接受访问者。
我相信还有其他方法。还必须解决扩展问题:如果新类型的动物加入派对,需要适应多少个代码位置,如何可靠地找到它们?
问题:
因此,在这些要求的背景下,难道多重分派不应该成为任何良好设计的面向对象语言的一个组成部分吗? 外部(不仅仅是内部)操作是否自然取决于给定对象的动态类型?