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# 中都是虚拟的。因此,虚拟方法是一个名称、一个符号,它可以在运行时多态地引用不同的事物(不同的方法)。

如果你很好奇,想知道其中涉及到什么样的魔法,你可以在虚拟方法表中查看详细信息。本质上,每个虚拟方法名称 likeon_Activation都被翻译为索引 like n,即n该类的第 th 个虚拟方法。每个非抽象类都提供一个表,其中指定了它的所有虚拟方法。因此,on_Activation对对象的调用被转换为n对该对象类的虚拟方法表中的第 th 项的调用。

于 2012-09-30T01:59:45.957 回答