C# 从数组列表中的对象调用适当的方法

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) 我希望调用重载函数,因为基类中的函数是虚拟

我有许多来自基类的派生类。 基类是FormItem,派生类是例如InputField、Label或Button

在FormItem类中,我有许多虚拟函数,例如:

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 */ }
    ...
}