2

C# に抽象クラスがあります。

  public void activation()
  {
       activated = true;
       on_Activation();
  }

  protected abstract void on_Activation();

シナリオ:

抽象クラスの子を作成し、メソッドの実装を作成したとしon_Activation()ます。

質問:

  • Activation()子クラスを呼び出すとどうなりますか?
  • on_Activation()の実装をon_Activation子クラスで使用しますか?
4

2 に答える 2

6

はい。これは仮想メソッドであるため (抽象的であるため暗黙的に)、その「最もオーバーライドされた」バージョンが呼び出されます。呼び出しが基本クラスで定義されたメソッドで発生するという事実は、違いはありません。

于 2012-09-30T00:19:54.460 に答える
1

はい。そして、ポリモーフィズムを発見しました。ポリモーフィズムとは、オブジェクトのようなメソッドを呼び出すだけでon_Activation(現在のオブジェクトが呼び出されたthisか、他のオブジェクトが呼び出されたかに関係なく)、どのバージョンon_Activationを意味するかを指定する必要がないことを意味します。のどのバージョンが実際に呼び出されるかを決定するのは、実行時のオブジェクトの実際の型です。on_Activation

Thomas が指摘したように、このように動作するメソッドはvirtualと呼ばれます。C# では、すべての抽象メソッドは仮想です。したがって、仮想メソッドは、実行時にさまざまなもの (さまざまなメソッド本体) をポリモーフィックに参照できる名前、シンボルです。

どのような魔法が使われているのか知りたい方は仮想法表で詳細を確認してください。基本的に、 のようなすべての仮想メソッド名は、このクラスの th 仮想メソッドである のon_Activationようなインデックスとして変換されます。すべての非抽象クラスは、すべての仮想メソッド本体が指定されたテーブルを提供します。したがって、オブジェクトに対する呼び出しは、そのオブジェクトのクラスの仮想メソッド テーブルの th エントリへの呼び出しとして変換されます。nnon_Activationn

于 2012-09-30T01:59:45.957 に答える