我在C#中有一个抽象类:
public void activation()
{
activated = true;
on_Activation();
}
protected abstract void on_Activation();
场景:
假设我已经成为抽象类的孩子并且实现了方法on_Activation()
。
问题:
Activation()
时会发生什么?on_Activation()
会在子类中使用on_Activation
的实现吗?答案 0 :(得分:6)
是。它是一种虚拟方法(隐含地,因为它是抽象的)所以它的覆盖范围最大。"版本将被调用。调用源自基类上定义的方法的事实没有区别。
答案 1 :(得分:1)
是。你刚刚发现了多态。多态性意味着您只需在对象上调用类似on_Activation
的方法(无论当前对象是否为this
,还是任何其他对象),您都不需要指定on_Activation
的哪个版本意思。它是运行时对象的实际类型,决定实际调用哪个版本的on_Activation
。
正如托马斯所说,以这种方式行事的方法称为虚拟。所有抽象方法都是C#中的虚拟方法。因此,虚拟方法是一个名称,一个符号,可以多态在运行时引用不同的东西(不同的方法 body )。
如果您感到好奇并想知道涉及哪种魔法,可以在Virtual method table查看详细信息。基本上每个虚拟方法名称(如on_Activation
)都被翻译为类似n
的索引,即此类的n
虚拟方法。每个非抽象类都提供一个表,其中指定了所有虚拟方法 bodies 。因此,对对象的on_Activation
的调用被转换为对该对象的类的虚方法表中的n
条目的调用。