为了从被覆盖的虚拟方法中调用基本虚拟方法,我该如何定义实例?
假设我有类Derived,它扩展了Base类。我在Base中有一个虚拟方法,它在Derived类中被覆盖。
像这样:Base instance = new Derived();
或者像这样:Derived instance = new Derived();
我肯定不会使用Base instance = new Based();
来调用虚拟方法,而不是它的覆盖。
答案 0 :(得分:2)
方法覆盖是否调用基类的实现不依赖于您使用的变量类型。因此,只要将base.MethodName()
添加到覆盖的实现中,您描述的前两种方法就可以了。
正如您所提到的,第三种方法不起作用,因为它不会调用方法的重写版本。
答案 1 :(得分:1)
这是一种可以做到这一点的难以理解的方式。您必须公开一个调用基本版本的方法。国际海事组织不这样做。但是......这是可能的。
void Main()
{
B b = new B();
b.DoSomething();
b.CallAVersionDoSomething();
}
class A
{
public virtual void DoSomething()
{
Console.WriteLine("A DoSomething");
}
}
class B : A
{
public override void DoSomething()
{
Console.WriteLine("B DoSomething");
}
public virtual void CallAVersionDoSomething()
{
base.DoSomething();
}
}
或者,如果您想要公开它,您可以在Base class
中公开另一种方法,为您完成工作。这是你的去向
class A
{
public virtual void DoSomething()
{
ActualDoSomething();
}
public void ActualDoSomething()
{
Console.WriteLine("A DoSomething");
}
}
class B : A
{
public override void DoSomething()
{
Console.WriteLine("B DoSomething");
}
}
并且您可以使用无法覆盖的instance.ActualDoSomething()
,因此您始终可以获得基类版本。