在抽象类中的非抽象方法中调用抽象方法

时间:2012-09-30 00:16:50

标签: c# class inheritance methods abstract

我在C#中有一个抽象类:

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

  protected abstract void on_Activation();

场景:

假设我已经成为抽象类的孩子并且实现了方法on_Activation()

问题:

  • 当我在孩子班级打电话给Activation()时会发生什么?
  • on_Activation()会在子类中使用on_Activation的实现吗?

2 个答案:

答案 0 :(得分:6)

是。它是一种虚拟方法(隐含地,因为它是抽象的)所以它的覆盖范围最大。"版本将被调用。调用源自基类上定义的方法的事实没有区别。

答案 1 :(得分:1)

是。你刚刚发现了多态。多态性意味着您只需在对象上调用类似on_Activation的方法(无论当前对象是否为this,还是任何其他对象),您都不需要指定on_Activation的哪个版本意思。它是运行时对象的实际类型,决定实际调用哪个版本的on_Activation

正如托马斯所说,以这种方式行事的方法称为虚拟。所有抽象方法都是C#中的虚拟方法。因此,虚拟方法是一个名称,一个符号,可以多态在运行时引用不同的东西(不同的方法 body )。

如果您感到好奇并想知道涉及哪种魔法,可以在Virtual method table查看详细信息。基本上每个虚拟方法名称(如on_Activation)都被翻译为类似n的索引,即此类的n虚拟方法。每个非抽象类都提供一个表,其中指定了所有虚拟方法 bodies 。因此,对对象的on_Activation的调用被转换为对该对象的类的虚方法表中的n条目的调用。