我有以下類別:虛擬方法和參數查找
Collider (abstract based class)
BoxCollider
MeshCollider
SphereCollider
從撞機最後3繼承。
用例是每個對撞機都應該可以檢查它是否與任何其他碰撞對象碰撞。
我想象中的電話應該是在對撞機類,看起來像:
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){..}
};
要確保這些方法是通對撞機基類訪問,我需要定義
class Collider
{
virtual bool isCollidingWith(SphereCollider* c){..}
virtual bool isCollidingWith(BoxCollider* c){..}
.. and so on
};
而且,由於呼叫this->isCollidingWith(*it)
只需要一個指向撞機和NOT一個派生類,我希望列出的那些虛擬類的適當方法是在運行時自動獲取的。但是,這似乎並非如此:因爲參數只是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 ...
}
這是不是真的優雅。有沒有其他(適當的)方式來處理這種情況? 謝謝!
當只有3種類型的關係時,您似乎會定義9個isCollidingWith()方法。 – imreal
我不確定。實際上有一半的案例會重複,並且可以進行優化。但區分盒子/球體和盒子/盒子的碰撞會很有趣 – iseeall
這是[Double Dispatch](http://en.wikipedia。org/wiki/Double_dispatch)問題 –