Как мы вызываем виртуальный метод из другого метода в базовом классе, даже если текущий экземпляр имеет производный класс? - PullRequest
4 голосов
/ 29 марта 2012

Как мы вызываем виртуальный метод из другого метода в базовом классе, даже если текущий экземпляр относится к производному классу?

Я знаю, что мы можем вызвать Method2 в Base класс из метода в Производный класс с использованием 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." );
    }
  }

}

С указанными выше кодами он выдаст:

Method1 in Derived class.
Method1 in Base class.
Method2 in Derived class.

, тогда как я ожидаю:

Method1 in Derived class.
Method1 in Base class.
Method2 in Base class.

Ответы [ 2 ]

6 голосов
/ 29 марта 2012

Нет, вы не можете этого сделать, цель виртуальных методов состоит в том, что производные классы могут переопределять реализацию и что реализация используется даже при вызове из базовых классов.

Если это вызывает проблемы, то код, который нужно запустить, не должен быть виртуальным методом.

4 голосов
/ 29 марта 2012

Очевидное решение:

    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();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...