首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在面向对象设计中避免RTTI

在面向对象设计中避免RTTI
EN

Stack Overflow用户
提问于 2012-02-15 03:08:36
回答 3查看 2.7K关注 0票数 10

最近我在某个论坛上看到了一个面向对象的设计问题,并开始考虑使用RTTI。然而,这一定是糟糕的设计,但我想不出一个替代方案。以下是一个简单的问题:

使用OO概念为以下场景创建一个C++程序-

我的狗叫巴迪,住在后院。当他看见一只猫或一只松鼠来拜访他时,他会在夜里吠叫。如果他看到一只青蛙,而且他饿了,他就把它吃掉。如果他看到一只青蛙,他不饿,他就玩它。如果他已经吃了两只青蛙,而且还饿着,他会放它走的。如果他看到一只土狼,他就哭着寻求帮助。有时他的朋友点路过,他们互相追逐。如果他看到任何其他动物,他只是看着它。我想你会有一个动物类,一个猫,狗,松鼠,土狼类,继承自动物类。

我开始考虑在狗类中有一个see()方法,该方法接受一个动物参数,然后检查对象的实际类型(青蛙、猫等),并根据实际类型采取所需的动作--播放、追逐等等。然而,这将需要RTTI,这肯定是糟糕的设计。谁能建议一个更好的设计,以避免RTTI,并指出在我的想法的错误?

EN

回答 3

Stack Overflow用户

发布于 2012-02-15 03:29:10

该设计特别要求承认某些实体,以便对它们执行某些操作。因为没有押韵或理由来解释为什么某些操作与某些实体(即:它都是任意的),所以您所看到的不是基于类型的调度,就是基于属性的调度。我会和后者一起去。

给每个实体一些属性集。因此,狗会根据这些特性做出反应。猫和松鼠将拥有财产,“狗应该对我吠叫。”当狗遇到具有这样一个属性的实体时,它将执行适当的操作。

在这种情况下,实体只不过是其属性的总和,以及基于遇到具有不同属性的其他实体的行为。该实体也可能具有与其相关联的状态。不会有专门的狗或猫班。只有一个实体具有类似猫的属性和行为,一个实体具有类似狗的属性和行为。

票数 6
EN

Stack Overflow用户

发布于 2012-02-15 03:13:38

提示:使用虚拟函数(在目标动物上)而不是RTTI。

票数 3
EN

Stack Overflow用户

发布于 2012-02-15 03:50:19

大多数情况下,您可以用消息来代替RTTI。

说大也大吧

代码语言:javascript
复制
Id id = object->send(WHO_ARE_YOU); 
switch(id)
{
  case ID_FROG: ...; break;
  case ID_CAT: ...; break;
}

在原则上,消息传递比RTTI更灵活:

代码语言:javascript
复制
other_object->send(IS_SCARRY_OF, this); 

因为它允许设计目前未知的关系。假设明天你的狗会看到在其他DLL和Pascal中定义的浣熊。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9287357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档