今回私は仮想フィールドに問題があります。もう一度多態性 - 仮想プロパティ
私のゲームオブジェクトのコアクラスがあります。このクラスには、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
私が代わりにフィールドの仮想プロパティとして定義されたモデルを作ってみましたが、 派生プロパティがそのベースと同じタイプである必要があるため、これは失敗します。他の多くのモデルタイプが存在するため、鋳造は役に立たない。ベースからではなく、派生クラスから値を読み取る場合はどうすればよいですか?
ゲームオブジェクトのタイプには正確なタイプのモデルが必要ですが、今はオブジェクトを作成する際に使用したいタイプを使用できます。また、MissileModelには、キャスティングなしでMissileには見えない余分なメソッドが含まれている可能性があります。/ –
あなたは誤解していると思います。あなたはまだGenericGameObjectから派生するミサイルタイプを持つことができます。モデルが強く型付けされているので、あなたはまだMissileModelメソッドを見ることができます。 –