2012-03-29 2 views
4

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

Я знаю, что мы можем назвать method2 в Base класса из метода в Derived класса, используя 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. 

ответ

6

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

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

+1

Я хочу, чтобы метод, который может быть переопределен, но он может быть вызван непосредственно в базовом классе, когда это необходимо. Спасибо, в любом случае. –

+0

@newgps Вам нужно будет вытащить код в другой метод, а затем в соответствии с решением Хенрика и моим советом. –

4

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

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(); 
    } 
+0

@ Adam Houldsworth - спасибо за редактирование. Конечно, частный метод не должен быть виртуальным. – Henrik

+0

Спасибо @Henrik. Ваше решение действительно работает, но мне интересно, можем ли мы это сделать, не добавляя другого метода. –

 Смежные вопросы

  • Нет связанных вопросов^_^