即使当前实例是派生类,我们如何从基类中的另一个方法调用虚方法?

Set*_*o N 5 c# virtual-functions base-class derived-class

即使当前实例是派生类,我们如何从基类中的另一个方法调用虚方法?

我知道我们可以调用方法2基地从方法的类派生类使用base.Method2() ,但我想要做的就是从其他的虚拟方法调用它什么基础类.可能吗?

using System;

namespace ConsoleApplication1
{
  class Program
  {
    static void Main( string[] args )
    {
      Base b = new Derived(  );
      b.Method1(  );
    }
  }


  public class Base
  {
    public virtual void Method1()
    {
      Console.WriteLine("Method1 in Base class.");
      this.Method2( );   // I want this line to always call Method2 in Base class, even if the current instance is a Derived object.
      // I want 'this' here to always refer to the Base class. Is it possible?
    }

    public virtual void Method2()
    {
      Console.WriteLine( "Method2 in Base class." );
    }
  }

  public class Derived : Base
  {
    public override void Method1()
    {
      Console.WriteLine( "Method1 in Derived class." );
      base.Method1();
    }

    public override void Method2()
    {
      Console.WriteLine( "Method2 in Derived class." );
    }
  }

}
Run Code Online (Sandbox Code Playgroud)

使用上面的代码,它将输出:

Method1 in Derived class.
Method1 in Base class.
Method2 in Derived class.
Run Code Online (Sandbox Code Playgroud)

而我期望的是:

Method1 in Derived class.
Method1 in Base class.
Method2 in Base class.
Run Code Online (Sandbox Code Playgroud)

Ada*_*rth 7

不,你不能这样做,虚方法的目的是派生类可以覆盖实现,甚至从基类调用时也使用实现.

如果这会导致问题,那么您需要运行的代码不应该是虚方法.


Hen*_*rik 6

明显的解决方案:

    public virtual void Method1()
    {
      Console.WriteLine("Method1 in Base class.");
      this.Method2Private( );
    }

    private void Method2Private()
    {
      Console.WriteLine( "Method2 in Base class." );
    }

    public virtual void Method2()
    {
      Method2Private();
    }
Run Code Online (Sandbox Code Playgroud)