我有以下课程:
Collider (abstract based class)
BoxCollider
MeshCollider
SphereCollider
最后 3 个继承自 Collider。
用例是每个对撞机应该可以检查它是否与任何其他对撞机发生碰撞。
我想调用应该在 Collider 类中,看起来像:
void Collider::checkCollisionsWithOtherColliders()
{
for(std::vector<Collider*>::iterator it ....)
{
if(this->isCollidingWith(*it){...}
}
}
现在问题来了,我应该如何定义 isCollidingWith
我想我需要为每对对撞机定义它,这意味着每种对撞机类型都应该为每种类型的对撞机提供此方法的一个版本作为参数,例如在 SphereCollider 中:
class SphereCollider : public Collider
{
bool isCollidingWith(SphereCollider* c){..}
bool isCollidingWith(BoxCollider* c){..}
bool isCollidingWith(MeshCollider* c){..}
};
为了确保这些方法可以通过 Collider 基类访问,我需要定义
class Collider
{
virtual bool isCollidingWith(SphereCollider* c){..}
virtual bool isCollidingWith(BoxCollider* c){..}
.. and so on
};
此外,由于调用this->isCollidingWith(*it)
只需要一个指向 Collider 而不是派生类的指针,我希望列出的那些虚拟方法的适当方法在运行时自动采用。然而,情况似乎并非如此:因为参数只是 Collider,它会寻找一个只有 Collider* 参数的方法。
我能想到的唯一解决方案是在 Collider 中定义:
bool isCollidingWith(Collider* collider)
{
if (0 != dynamic_cast<SphereCollider*>(collider))
return isCollidingWith(dynamic_cast<SphereCollider*>(collider));
else if (0 != dynamic_cast<BoxCollider*>(collider))
return isCollidingWith(dynamic_cast<BoxCollider*>(collider));
else if ...
}
这不是很优雅。有没有其他(适当的)方法来处理这种情况?谢谢!