今回は仮想フィールドに問題があります。
ゲームオブジェクトのコアクラスがあります。このクラスには、Model クラス オブジェクトを含むフィールドが含まれています。モデルのオブジェクトには、位置などの値が含まれています。
今-描画中に、モデルから各オブジェクトの位置を読み取る必要があります。問題は、デフォルトのモデルクラスの代わりに派生を使用しているときに始まります。例:
abstract class GenericGameObject { public DefaultGameObjectModel Model = new DefaultGameObjectModel(); }
class Missile : GenericGameObject { public new MissileModel Model = new MissileModel(); }
class DefaultGameObjectModel { public Vector2 Position = new Vector2(){X=0}; }
class MissileModel : DefaultGameObjectModel { }
Missile m = new Missile();
m.Model.Position.X = 10;
// NOT OK! ((GenericGameObject)m).Model.Position.X == 0
モデルをフィールドではなく仮想プロパティとして定義しようとしましたが、派生プロパティはそのベースと同じ型でなければならないため、これは失敗します。他の多くのモデル タイプがあるため、キャスティングは無駄です。ベースからではなく、派生クラスから値を読み取りたい場合はどうすればよいですか?
私はすでにこの質問をしましたが、答えは解決策をもたらしませんでした。説明:
インターフェイス IGameObjectModel を使用する
コンセプトは良いのですが、フィールドを強制する必要があります。インターフェイスはフィールドを定義できないため、プロパティを定義する必要があります。しかし、Position はフィールドではないため、IGameObjectModel.Position.X=10 を実行できません。
GenericGameObject を GenericGameObject や Missile などのジェネリック タイプにするために、GenericGameObject から派生したタイプにするため に、ミサイルを GenericGameObject にキャストして、通常はそれらのオブジェクトを同じリストに格納することができませんでした。もちろん、これら 2 つが継承できる主な基本型を作成することはできますが、Model フィールドにアクセスすることはできません。
モデルをフィールドではなくプロパティにします。 派生クラスのプロパティ タイプを変更することはできません。
どうすればいいですか?