从被覆盖的方法中调用虚方法

时间:2014-02-26 10:27:09

标签: c# polymorphism virtual

为了从被覆盖的虚拟方法中调用基本虚拟方法,我该如何定义实例?

假设我有类Derived,它扩展了Base类。我在Base中有一个虚拟方法,它在Derived类中被覆盖。

像这样:Base instance = new Derived();

或者像这样:Derived instance = new Derived();

我肯定不会使用Base instance = new Based();来调用虚拟方法,而不是它的覆盖。

2 个答案:

答案 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(),因此您始终可以获得基类版本。