我正在爲Android遊戲編寫Java遊戲引擎,我的引擎處理不同形狀的碰撞檢測。每個形狀都是它自己的類(正方形,圓形等),並從共同的抽象母體Collidable派生。我有一個物理管理員課程,主要檢查遊戲中是否有任何現有對象與另一個對象發生碰撞,然後在檢測到碰撞時執行相應的操作。碰撞檢查是在每個物理形狀子類內部實現的,如下面的代碼所示。Java繼承/ OOP - 調用父類只有句柄的特定子類的方法
public abstract class Collidable
{
}
public class Square extends Collidable
{
public boolean Collides(Square) {...}
public boolean Collides(Circle) {...}
public boolean Collides(Triangle) {...}
}
public class Circle extends Collidable
{
public boolean Collides(Square) {...}
public boolean Collides(Circle) {...}
public boolean Collides(Triangle) {...}
}
public class Triangle extends Collidable
{
public boolean Collides(Square) {...}
public boolean Collides(Circle) {...}
public boolean Collides(Triangle) {...}
}
public class PhysicsMgr
{
public boolean Collides(Collidable p1, Collidable p2)
{
return p1.Collides(p2);
// This obviously won't work because there is no Collides
// method in Collidable. I want it to somehow call the child's
// method and pass in p2 as its child type rather than as
// a parent. Or somehow do this:
return (p1.child()).Collides(p2.child());
// I know that obviously nothing like this exists.
}
}
我知道「的instanceof」和真的不想檢查P1和P2與每一個碰撞形狀我的孩子類型。一定會有更好的辦法。我正在尋找解決當前問題的解決方法,或者最好是重新設計當前的碰撞檢測系統,以完全避免此問題。
謝謝!
有一個碰撞檢測的標準方法檢查multimethod實現:http://www.codeproject.com/KB/recipes/mmcppfcs.aspx – AlexTheo