この問題を正しく説明できるといいのですが、少し混乱します。
flixel に似たゲーム ライブラリに取り組んできましたが、Flash の代わりに C# の XNA フレームワークを使用しています。現在のクラス構成はこんな感じです。
ClxBasic -> ClxObject -> ClxSprite
各クラスにはコンストラクターがあり、その下のクラスのコンストラクターを呼び出します。これを行うには、このコードを使用します。
namespace Test
{
public class ClxBasic
{
public ClxBasic()
{
Constructor();
}
public void Constructor()
{
DoSomething();
}
}
public class ClxObject : ClxBasic
{
public ClxObject() : base()
{
Constructor();
}
public void Constructor()
{
DoSomething();
}
}
public class ClxSprite : ClxObject
{
public ClxSprite() : base()
{
Constructor();
}
public void Constructor()
{
DoSomething();
}
}
}
基本的に、新しい ClxSprite を作成すると、ClxSprite コンストラクターが呼び出され、その下にあるすべてのコンストラクター (ClxObject および ClxBasic) が呼び出されます。
これを行うためのより簡単な方法があると確信しており、私はすべて耳を傾けています。
ただし、私のより大きな問題は、実際には他のクラスからメソッドを適切に派生させてオーバーライドする方法です。
問題は、ClxSprite から拡張されたクラスを作成する場合、たとえば、最も基本的なクラス (ClxBasic) からオーバーライドされたメソッドを呼び出す場合、一番上のメソッドではなく一番下のメソッドのみを呼び出すことです。
これを行う必要がある理由は、ClxBasic コンストラクターのリストに自分自身を追加することによって ClxBasic から派生したすべてのオブジェクトを制御するグローバル クラスがあるためです。
コード例を次に示します。
namespace Test
{
public static class ClxG()
{
public static List<ClxBasic> GlobalObjects; //All objects will be added here by the ClxBasic constructor
ClxSprite test = new ClxSprite();
GlobalObjects.Add(test);
public static Update()
{
foreach(ClxBasic basic in GlobalObjects)
basic.Update(); //Calling this calls ClxBasic.Update() when it should call ClxSprite.Update()
}
}
}
basic.Update() を呼び出すと、オブジェクトが ClxObject または ClxSprite またはその他の派生クラスであるにもかかわらず、ClxBasic にある一番下の Update に移動します。
foreach ループで ClxBasic を ClxSprite に変更することで、そのクラスのコンストラクター メソッドを適切に呼び出すことができます。ただし、メソッドをオーバーライドするライブラリに基づいてカスタム クラスを作成する場合は、下位の Update が呼び出されます。
ただし、特に計画していないクラスを追加することはできません。たとえば、ClxSprite からクラス Player を派生させ、Update() メソッドをオーバーライドする場合、GlobalObjects リストに追加されますが、更新が呼び出されることはなく、最高になるのは ClxSprite です。
私がそれを機能させたい方法は、Game1.cs で、FlxG.Update() を Game.Update() ループに入れ、オブジェクトを作成し、フレームワークが残りを処理できるようにすることです。
全体がある種の継承の開始のように感じ、ある種の脳を傷つけます。