繁体   English   中英

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

[英]Calling an abstract method in a non-abstract method within an abstract class

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

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

  protected abstract void on_Activation();

场景:

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

问题:

  • 当我在子类中调用Activation()时会发生什么?
  • on_Activation()使用的实施on_Activation在子类?

是。 这是一个虚拟方法(隐式,因为它是抽象的),因此将调用其“最被覆盖”的版本。 调用源自基类上定义的方法的事实没有区别。

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

正如Thomas所指出的那样,以这种方式运行的方法称为virtual 所有抽象方法在C#中都是虚拟的。 因此,虚拟方法是一个名称,符号,可以在运行时多态地引用不同的事物(不同的方法主体 )。

如果您好奇并且想知道涉及哪种魔术,则可以在“ 虚拟方法表”中查看详细信息。 本质上,每个虚拟方法名称(如on_Activation都将转换为索引(如n ,即该类的第n个虚拟方法。 每个非抽象类都提供一个表,其中指定了其所有虚拟方法主体 因此, on_Activation对象的on_Activation的调用转换为对该对象类的虚拟方法表中的第n个条目的调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM