2012-06-17 77 views
3

我有一个主类,有几个继承成员,它们都重载父类的相同Draw方法,但具有不同的Initialize方法。是否有可能为每个继承类使用相同的列表类型,从而能够遍历Draw方法?我非常肯定你可以用C++中的模板来做到这一点,但似乎无法找到在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) 
} 

我敢肯定我在这里失去了一些东西。我不必以这种确切的方式去做,我宁愿寻找处理这些情况的一般方法。

谢谢!

回答

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(); 
} 
+0

这似乎解决了列表问题,谢谢! –

0

你必须创建在基类ExpandingWindow一个抽象虚拟方法,然后重写派生类方法。

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

+0

我听起来像Tormod已经做到了,但在创建通用列表时遇到了问题。 – Zbigniew

+0

我已经将Init方法实现为抽象,并将Draw绘制为虚拟。尽管如此,我可能做得很糟糕。截至目前,我将不得不在Initiation方法中为继承类中的每个不同的Init方法(由于不同的方法参数)重载Init方法。有没有办法解决?将实施ExpandingWindows作为界面有帮助吗? –

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); 
+0

我很高兴你提出这个问题,因为我虽然完全一样! :)我虽然尝试过,但我偶然发现了另一个问题。有: MainMenu(A,B,C) 作为构造函数,它没有工作,编写 list.Add(新MainMenu(A,B,C)) 编译器告诉我,没有方法带有3个参数,我相信这是...所以我一定错过了一些东西! –

+0

从您的评论,我给了它另一个尝试。好像我在构造函数中包含了一个void语句。我删除了虚空,现在它工作。很好的反馈。谢谢! –