处理派生类的细节而不向下转换

Handling specifics of derived classes without downcasting

本文关键字:转换 细节 派生 处理      更新时间:2023-10-16

假设我有两种不同类型的碰撞体,圆形和盒子,它们来自同一个基本碰撞体类。我有一个实体类,其中包含指向碰撞器的指针,该碰撞器可以是圆形碰撞体或盒子碰撞体。

class Collider {};
class CircleCollider : public Collider
{
    // Defines a circle
};
class BoxCollider : public Collider
{
    // Defines a rectangle
};
class Entity
{
    Collider* collider;
};

我想制作一个碰撞处理程序,我可以传递一堆实体并让它弄清楚如何解决它们的冲突,但为了做到这一点,处理程序需要知道它正在处理什么类型的碰撞器。

当问题像这样被框定时,唯一的解决方案似乎是向下投掷,但我想知道我是否只是以错误的方式接近它。这似乎是一种常见的情况,但我很难找到解决方案,这让我怀疑要么还有其他我没有看到的方法,要么是这种情况,人们只需要使用向下投射。

由于碰撞处理特定于不同的对撞机,因此我似乎不能在这里使用访客模式还是我错了?

如果你在 Collider 类中添加了一个虚拟方法 collidesWith(Collider c),并在 BoxCollider 和 CircleCollider 中添加了特定的实现,这将确定这些特定实例是否发生冲突,外部碰撞处理程序将永远不必向下投射,甚至不必知道它正在使用什么特定类型的碰撞体。