3

我有一个主类,其中有几个继承的成员,它们都重载了父类的相同 Draw 方法,但具有不同的 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,然后在派生类中覆盖该方法。

另一种选择是定义一个具有一个Draw方法的 IExpandingWindow 接口,并在您的类中实现它。

于 2012-06-17T09:52:38.383 回答