1

基本クラスから派生したクラスがいくつかあります。基本クラスはFormItemであり、派生クラスは、たとえば、InputField、Label、またはButtonです。

FormItemクラスには、次のようないくつかの仮想関数があります。

internal virtual void draw(parameters) {}

この関数は、派生クラスごとにオーバーロードされます。

派生クラスから作成されたオブジェクトをformItemsという配列リストに格納します。

私がこのように電話をかけるとき:

((FormItem)formItems[index]).draw(parameters)

基本クラスの関数は仮想であるため、オーバーロードされた関数が呼び出されることを期待しています。ただし、代わりに基本クラスのdraw()メソッドが呼び出されます。

これに対するかなり醜い解決策の1つは、次のような巨大なifステートメントを作成することです。

if (formItems[index] is Button)
  {
  ((Button)formItems[index]).draw(parameters);
  }
 else if (formItems[index] is Label)

等...

ただし、この巨大な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 に答える