2012-03-29 18 views
4

即使當前實例是派生類,我們如何從基類中的另一個方法調用虛方法?即使當前實例是派生類時,我們如何從基類中的另一個方法調用虛方法?

我知道我們可以從派生類中的方法,通過使用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

我想可重寫的方法,但它可以直接在基類在需要時被調用。不管怎麼說,還是要謝謝你。 – 2012-03-29 09:42:24

+0

@newgps您將需要將代碼拉出到另一種方法,然後根據Henrik的解決方案和我的建議。 – 2012-03-29 09:44:18

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 2012-03-29 09:04:09

+0

謝謝@Henrik。你的解決方案確實有效,但我想知道我們是否可以做到這一點,而無需添加其他方法。 – 2012-03-29 09:45:27

相關問題