最近我在某个论坛上看到了一个面向对象的设计问题,并开始考虑使用RTTI。然而,这一定是糟糕的设计,但我想不出一个替代方案。以下是一个简单的问题:
使用OO概念为以下场景创建一个C++程序-
我的狗叫巴迪,住在后院。当他看见一只猫或一只松鼠来拜访他时,他会在夜里吠叫。如果他看到一只青蛙,而且他饿了,他就把它吃掉。如果他看到一只青蛙,他不饿,他就玩它。如果他已经吃了两只青蛙,而且还饿着,他会放它走的。如果他看到一只土狼,他就哭着寻求帮助。有时他的朋友点路过,他们互相追逐。如果他看到任何其他动物,他只是看着它。我想你会有一个动物类,一个猫,狗,松鼠,土狼类,继承自动物类。
我开始考虑在狗类中有一个see()方法,该方法接受一个动物参数,然后检查对象的实际类型(青蛙、猫等),并根据实际类型采取所需的动作--播放、追逐等等。然而,这将需要RTTI,这肯定是糟糕的设计。谁能建议一个更好的设计,以避免RTTI,并指出在我的想法的错误?
发布于 2012-02-15 03:29:10
该设计特别要求承认某些实体,以便对它们执行某些操作。因为没有押韵或理由来解释为什么某些操作与某些实体(即:它都是任意的),所以您所看到的不是基于类型的调度,就是基于属性的调度。我会和后者一起去。
给每个实体一些属性集。因此,狗会根据这些特性做出反应。猫和松鼠将拥有财产,“狗应该对我吠叫。”当狗遇到具有这样一个属性的实体时,它将执行适当的操作。
在这种情况下,实体只不过是其属性的总和,以及基于遇到具有不同属性的其他实体的行为。该实体也可能具有与其相关联的状态。不会有专门的狗或猫班。只有一个实体具有类似猫的属性和行为,一个实体具有类似狗的属性和行为。
发布于 2012-02-15 03:13:38
提示:使用虚拟函数(在目标动物上)而不是RTTI。
发布于 2012-02-15 03:50:19
大多数情况下,您可以用消息来代替RTTI。
说大也大吧
Id id = object->send(WHO_ARE_YOU);
switch(id)
{
case ID_FROG: ...; break;
case ID_CAT: ...; break;
}在原则上,消息传递比RTTI更灵活:
other_object->send(IS_SCARRY_OF, this); 因为它允许设计目前未知的关系。假设明天你的狗会看到在其他DLL和Pascal中定义的浣熊。
https://stackoverflow.com/questions/9287357
复制相似问题