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

モデルをフィールドではなく仮想プロパティとして定義しようとしましたが、派生プロパティはそのベースと同じ型でなければならないため、これは失敗します。他の多くのモデル タイプがあるため、キャスティングは無駄です。ベースからではなく、派生クラスから値を読み取りたい場合はどうすればよいですか?

4

2 に答える 2

3

GenericGameObject型パラメーターがから派生するジェネリック型である必要があるように思えますDefaultGameObjectModel

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

     // Or whatever
     public TModel Model
     {
         get { return model; }
         protected set { model = value; }
     }
}
于 2009-04-06T16:33:07.607 に答える