私は次のクラスを持っています:
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 ...
}
これは本当にエレガントではありません。そのような状況を処理する他の(適切な)方法はありますか?ありがとう!