【问题标题】:Calling an abstract method in a non-abstract method within an abstract class在抽象类的非抽象方法中调用抽象方法
【发布时间】:2012-09-21 09:04:25
【问题描述】:
我在 C# 中有一个抽象类:
public void activation()
{
activated = true;
on_Activation();
}
protected abstract void on_Activation();
场景:
假设我已经创建了抽象类的子类并实现了方法on_Activation()。
问题:
- 当我在子类中调用
Activation() 会发生什么?
-
on_Activation() 会在子类中使用on_Activation 的实现吗?
【问题讨论】:
标签:
c#
class
inheritance
methods
abstract
【解决方案1】:
是的。它是一个虚拟方法(隐含地,因为它是抽象的)所以它的“最被覆盖”的版本将被调用。调用源自基类上定义的方法这一事实没有任何区别。
【解决方案2】:
是的。而您刚刚发现了多态性。多态性意味着您只需在对象上调用类似on_Activation 的方法(无论是当前对象称为this,还是任何其他对象),您无需指定您指的是哪个版本的on_Activation。实际调用 on_Activation 的版本是运行时对象的实际类型。
正如 Thomas 所指出的,以这种方式运行的方法称为 virtual。所有抽象方法在 C# 中都是虚拟的。因此,虚拟方法是一个名称、一个符号,它可以在运行时多态引用不同的事物(不同的方法主体)。
如果你好奇,想知道其中涉及到什么样的魔法,可以到Virtual method table查看详情。基本上每个像on_Activation 这样的虚拟方法名称都被翻译为像n 这样的索引,也就是这个类的nth 虚拟方法。每个非抽象类都提供一个表,其中指定了它的所有虚拟方法body。因此,对对象的on_Activation 调用被转换为对该对象类的虚拟方法表中的nth 条目的调用。