如何在C#中创建通用列表/模板列表

时间:2012-06-17 09:48:17

标签: c# .net xna-4.0

我有一个带有几个继承成员的主类,它们都重载父类的相同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)
 }

我很确定我在这里遗漏了一些东西。我没有必要这样做,我宁愿寻找处理这些情况的一般方法。

谢谢!

3 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分: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);

答案 2 :(得分:0)

您必须在基类ExpandingWindow中创建抽象虚拟方法,然后在派生类中重写该方法。

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