1

我有许多来自基类的派生类。基类是 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)

ETC...

但是我希望有一个更好的解决方案,不需要我创建这个巨大的 if-else 块,但允许我让编译器自动将我正在查看的项目解释为派生类的对象,并且调用适当的 draw() 方法。有谁能够帮助我?

4

1 回答 1

3
internal virtual void draw(parameters) {}

该函数在每个派生类中都被重载。

我怀疑这是真的。为确保您自动调用正确的实现,必须在每个派生类中重写它,即

class Button : FormItem {
    internal override void draw(parameters) { /* actual impl */ }
    ...
}

只要你override,它应该可以正常工作。

于 2012-08-23T07:30:55.907 回答