簡體   English   中英

為什么在C#中不能使用覆蓋方法? (與關鍵字無關)

[英]Why is can't use overriding method in C#? (not about keyword)

public abstract class A
{
    public void CallMe() { Console.WriteLine("I am A."); }
}

public class B : A
{
    new public void CallMe() { Console.WriteLine("I am B."); }
}

class Program
{
    static void Main(string[] args)
    {
        A a = new B();
        a.CallMe();
    }
}

輸出為“我是A”。

為什么會這樣呢? 這合理嗎?

由Visual Studio 2012編譯。

您需要將基類中的CallMe()方法設為virtual ,然后在B使用override修飾符:

public abstract class A
{
    public virtual void CallMe() { Console.WriteLine("I am A."); }
}

public class B : A
{
    public override void CallMe() { Console.WriteLine("I am B."); }
}

B.CallMe()不會覆蓋A.CallMe() ,它會陰影或隱藏A.CallMe() 由於CallMe是非虛擬方法,因此編譯器根據a變量的編譯時間類型選擇要調用的方法。 由於的編譯時間類型aclass A它將調用A.CallMe()

如果你想它來調用B.CallMe()你需要使用virtual的關鍵字A.CallMe()這將使虛擬調度,其中應用程序將調用CallMe()根據運行時類型的方法, aclass B

請參見通過繼承隱藏

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM