我有一個類層次結構,例如:C++設計問題
Entity
Stationary
Tree
Creature
Bear
Crow
而且我有一個世界和一個播放器。當玩家碰到東西時,它會調用handleCollision(Entity * entity),然後根據不同情況發生的事情;如果玩家撞到樹上,則在玩家攻擊時沒有任何反應,如果它是熊。問題是我不確定如何以好的方式區分案例。
想到的一個想法是這樣的。 Player :: handleCollision(Entity *)調用Entity-> handleCollisionHelper(Player &)。這是一個虛擬函數,它在Tree中什麼也不做,在Creature(它應該攻擊所有生物)時調用Player.handleCollisionCreature(this),然後將攻擊代碼放置在handleCollisionCreature中。有沒有更好的方法來做到這一點而不使用RTTI(typeid等)?
你在做什麼很好。它被稱爲雙重派遣,在這種情況下是一種常見模式。 – 2010-01-11 11:02:05
我不知道爲什麼大家都認爲這是雙發。我們只有一個具有變量類型的對象(與(實體)碰撞的對象)。等式的另一端有一個固定類型的對象(一個Player)。因此,這是一次調度,因此虛擬功能是實現解決方案的完美方式。 – 2010-01-11 15:33:17
Martin,僅使用單個分派來實現這一點的方法需要在實體基類(和派生類)中使用諸如「CollidedWithPlayer()」的方法。這是可能的,但相當有限 - 當你希望突然開始支持與其他對象的碰撞時會發生什麼?或者當玩家也是基類,並且可能有不同的具有特定碰撞的子類? 取決於上下文,它可能是一個可行的解決方案。可能不在這裏描述的上下文中。 – Hexagon 2010-01-12 05:50:14