我有一个带有几个继承成员的主类,它们都重载父类的相同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)
}
我很确定我在这里遗漏了一些东西。我没有必要这样做,我宁愿寻找处理这些情况的一般方法。
谢谢!
答案 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接口,并在您的类中实现它。