C# 从数组列表中的对象调用适当的方法
我有许多来自基类的派生类。 基类是FormItem,派生类是例如InputField、Label或Button 在FormItem类中,我有许多虚拟函数,例如:C# 从数组列表中的对象调用适当的方法,c#,inheritance,xna,polymorphism,C#,Inheritance,Xna,Polymorphism,我有许多来自基类的派生类。 基类是FormItem,派生类是例如InputField、Label或Button 在FormItem类中,我有许多虚拟函数,例如: internal virtual void draw(parameters) {} 此函数在每个派生类中重载 我将从派生类生成的对象存储在一个名为formItems的数组列表中 当我打这样的电话时: ((FormItem)formItems[index]).draw(parameters) 我希望调用重载函数,因为基类中的函数是虚拟
internal virtual void draw(parameters) {}
此函数在每个派生类中重载
我将从派生类生成的对象存储在一个名为formItems的数组列表中
当我打这样的电话时:
((FormItem)formItems[index]).draw(parameters)
我希望调用重载函数,因为基类中的函数是虚拟的。然而,基类的draw()方法被调用
解决这一问题的一个相当丑陋的办法是做出一个巨大的if声明,例如:
if (formItems[index] is Button)
{
((Button)formItems[index]).draw(parameters);
}
else if (formItems[index] is Label)
等等
但是,我希望有一个更好的解决方案,它不需要我创建这个巨大的if-else块,而是允许编译器将我正在查看的项自动解释为派生类的对象,并调用相应的draw()方法。有人能帮我吗
此函数在每个派生类中重载
我怀疑这是真的。为了确保自动调用正确的实现,必须在每个派生类中重写它,即
class Button : FormItem {
internal override void draw(parameters) { /* actual impl */ }
...
}
只要您
重写
,它就可以正常工作。如何重写派生类中的虚拟方法?你能给我们看看你的代码吗?这是面向对象的概念,多态性,你不需要检查类型和调用合适的方法。您在跟踪方面做得很好,但很明显,您的实现中有一个bug。如何重写虚拟方法绘图的Post代码示例。
class Button : FormItem {
internal override void draw(parameters) { /* actual impl */ }
...
}