c++ - 如果按类型比较是糟糕的设计,那么在这种情况下我该怎么办? (多态性)

标签 c++ oop uml class-diagram

我有一项任务,我必须为 Donkey Kong Original 游戏编写 UML 类图。

在游戏中,有一些小的过场动画可以操纵特定的实体(实体的子类)。因此我制作了一个过场动画类来管理它。我的问题是,我不想将我所有的实体子类都包含到 Cutscene 中,因为这对我来说似乎没有必要(它还会使我的 UML 图看起来很乱 :p)。我宁愿让我的过场动画包括我的实体类,然后将我的子实体作为敌人传入以进行检查以查看我正在处理哪个实体,以便我可以适本地操纵它们。 (看起来更干净?)。

但是,我在这里阅读:http://www.cplusplus.com/forum/general/21246/必须以这种方式使用多态性是糟糕的设计。不过,我确实将它用于其他目的。

如果有人能告诉我我是不是傻瓜以及我应该做什么,那将不胜感激!

URL Diagram

最佳答案

如果您想检查实体实例的类型,请查看“访问者”模式,它是在 C++ 中进行双重分派(dispatch)的一种解决方案。

class EntityVisitor {
    virtual void Visit(const Ladder& ladder) = 0;
    virtual void Visit(const Mario& mario) = 0;
    ...
};

您的“实体”将具有一个接受“访问者”的纯虚函数。

virtual Accept(EntityVisitor& visitor) = 0;

并且每个子类都实现此方法,将 *this 传递给访问者的“访问”函数。

void Mario::Accept(EntityVisitor& v) { 
    v.Visit(*this); // Calls the 'Mario' overload.
}

关于c++ - 如果按类型比较是糟糕的设计,那么在这种情况下我该怎么办? (多态性),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36497067/

相关文章:

c++ - 在 C++ 中将文件名作为参数传递

c++ - 在类计时器中重载前缀和后缀增量。调试时出现问题

c++ - 在 heapsort 程序中出现 sigabrt 错误

javascript - D3 调度传入参数和调用上下文

uml - 如何在图表上显示两种状态之间的交互?

C++ 单例惰性初始化实现和链接似乎有冲突

ruby - 我(认为)当我希望我的数组只有 2 个可用属性时,我正在返回对象

java - 需要 EnumSet/EnumMap 而非泛化 Set/Map

.net - 在 Visual Studio 2012 中自定义 UMLClassDiagram

php - 如何在 UML 类图中描述一个方法接受多种类型?