2009-04-06 14 views
0

今回私は仮想フィールドに問題があります。もう一度多態性 - 仮想プロパティ

私のゲームオブジェクトのコアクラスがあります。このクラスには、Modelクラスオブジェクトを持つフィールドが含まれています。モデルのオブジェクトには、位置などの値が含まれています

今、私はモデルから各オブジェクトの位置を読み取る必要があります。問題は、デフォルトモデルクラスの代わりに派生関数を使用しているときに開始されます。例:

abstract class GenericGameObject { public DefaultGameObjectModel Model = new DefaultGameObjectModel(); } 
class Plane : GenericGameObject { public void shoot(Missile m){ m.Model.Position.X = 10; } } 
class Missile : GenericGameObject { public new MissileModel Model = new MissileModel(); } 

class DefaultGameObjectModel { public Vector2 Position = new Vector2(){X=0}; } 
class MissileModel : DefaultGameObjectModel { } 

Plane p = new Plane(); 
Missile m = new Missile(); 
p.shoot(m); 
// NOT OK! ((GenericGameObject)m).Model.Position.X == 0 

私が代わりにフィールドの仮想プロパティとして定義されたモデルを作ってみましたが、 派生プロパティがそのベースと同じタイプである必要があるため、これは失敗します。他の多くのモデルタイプが存在するため、鋳造は役に立たない。ベースからではなく、派生クラスから値を読み取る場合はどうすればよいですか?

答えて

3

これは、型パラメータがDefaultGameObjectModelから派生ジェネリック型、であるためにあなたのGenericGameObjectニーズのように聞こえる:

abstract class GenericGameObject<TModel> 
    where TModel : DefaultGameObjectModel 
{ 
    private TModel model; 

    // Or whatever 
    public TModel Model 
    { 
     get { return model; } 
     protected set { model = value; } 
    } 
} 
+0

ゲームオブジェクトのタイプには正確なタイプのモデルが必要ですが、今はオブジェクトを作成する際に使用したいタイプを使用できます。また、MissileModelには、キャスティングなしでMissileには見えない余分なメソッドが含まれている可能性があります。/ –

+0

あなたは誤解していると思います。あなたはまだGenericGameObject から派生するミサイルタイプを持つことができます。モデルが強く型付けされているので、あなたはまだMissileModelメソッドを見ることができます。 –

1

ます。またIGameObjectModelインターフェイスを作成し、あなたのオブジェクトモデルクラスのそれぞれで、それを実装することができます。あなたのGameObjectはIGameObjectModelのインスタンスを持ちます。

+0

私はアイデアが欲しいですが、基本クラスには、すべての派生クラス(移動、回転など)で共有されるいくつかのコードが含まれています。私はその場合DRYルールを破るだろう。 –

+0

基本クラスは引き続きDefaultGameObjectModelクラスを継承し、独自のインターフェイス実装を持つことができます。 –

+0

その場合、あなたはもちろん正しいです。私は同じことのためにベースクラスとインターフェイスの両方を持つことは奇妙だと思う:)しかし、それはそのように解決することができます –