3

親クラスの同じDrawメソッドをオーバーロードするいくつかの継承されたメンバーを持つ1つのメインクラスがありますが、Initializeメソッドは異なります。継承されたすべてのクラスに同じリストタイプを使用して、Drawメソッドを反復処理できるようにすることはどういうわけか可能ですか?C ++のテンプレートを使用してこれを実行できると確信していますが、C#で実行する方法を見つけることができないようです。次に例を示します。

class MainMenu : ExpandingWindow{
   Init(A,B)
   Draw(D)
}

class SideMenu : ExpandingWindow{
   Init(A,B,C)
   Draw(D)
}

私ができるようになりたい:

 WindowList List<ExpandingWindow>

 WindowList.Add(new MainMenu)
 WindowList.Add(new SideMenu)

 WindowList[0].Initialize(A,B)
 WindowLIst[1].Initialize(A,B,C)

と:

 for each window in WindowList{
   window.Draw(D)
 }

私はここで何かが欠けていると確信しています。私はこのように正確にそれを行う必要はありません、私はむしろこれらの状況をうまく処理する一般的な方法を探しています。

ありがとう!

4

3 に答える 3

2

試す:

IList<ExpandingWindow> windows = new List<ExpandingWindow>();

// initialize them via constructor
windows.Add(new MainMenu(A, B));    
windows.Add(new SideMenu(A, B, C));

foreach(var window in windows) {
    window.Draw();
}
于 2012-06-17T09:51:02.253 に答える
1

各サブクラスに異なるメソッドがある場合、それらはインターフェースに属していないため、明示的なキャストなしでは呼び出すことができません(これはOOPでは悪いことです)。

おそらくやりたいことは、コンストラクターにパラメーターを渡してから、同じシグニチャーを使用してインターフェースメソッドを呼び出すことです。

class ExpandingWindow
{
     public virtual void Draw(D obj) { ... }
}

public class MainMenu : ExpandingWindow
{
     public MainMenu(A a, B b)
     { 
         // assign MainMenu-specific parameters
     }

     // inherit Draw from the base class,
     // or override it if necessary
}

public class SideMenu : ExpandingWindow
{
     public SideMenu(A a, B b, C c)
     { 
         // assign SideMenu-specific parameters
     }

     // inherit Draw from the base class,
     // or override it if necessary
     public override Draw(D d)
     {
         // some side-menu specific stuff
         d.DoStuff();

         // call the base method after that
         base.Draw(d);
     }
}

次に、具象インスタンスを作成するときに特定のパラメーターを渡します(現時点では、インスタンス化するクラスを知っている必要があるため)。

List<ExpandingWindow> windows = new List<ExpandingWindow>();

windows.Add(new MainMenu(a, b));
windows.Add(new SideMenu(a, b, c));

foreach (var w in windows)
   w.Draw(d);
于 2012-06-17T10:04:32.563 に答える
0

基本クラスで抽象メソッドまたは仮想メソッドを作成してからExpandingWindow、派生クラスでそのメソッドをオーバーライドする必要があります。

もう1つのオプションは、1つのDrawメソッドを持つIExpandingWindowインターフェースを定義し、それをクラスに実装することです。

于 2012-06-17T09:52:38.383 に答える