簡體   English   中英

覆蓋C#,使兩個后續方法成為虛擬

[英]Overriding in C#, making two subsequent method virtual

這是一個覆蓋C#的問題。

當我使用以下代碼時:

class Program
{


    class A
    {
        public virtual void callme()
        {
            Console.WriteLine("this is A");
        }
    }
    class B : A
    {
        public new virtual void callme()
        {
            Console.WriteLine("this is B");
        }
    }
    class C : B
    {
        public override void callme()
        {
            Console.WriteLine("this is C");
        }
    }


    static void Main(string[] args)
    {
        A obj = new C();
        obj.callme();
        Console.ReadKey();
    }
}

輸出: This is A

當我使用時:

class Program
{


    class A
    {
        public virtual void callme()
        {
            Console.WriteLine("This is A.");
        }
    }
    class B : A
    {
        public override void callme()
        {
            Console.WriteLine("This is B.");
        }
    }
    class C : B
    {
        public override void callme()
        {
            Console.WriteLine("This is C.");
        }
    }


    static void Main(string[] args)
    {
        A obj = new C();
        obj.callme();
        Console.ReadKey();
    }
}

輸出: This is C.

因此,如果我在后續類( AB )中創建一個虛擬方法,為什么它調用最后一個方法,如果B類重寫AC重寫B那么它調用C的方法。

請解釋。

在第一種情況下,B是陰影A,C是覆蓋B中的陰影。因此只要參考類型是A,它就會調用A方法。

在第二種情況下,B覆蓋A,C覆蓋B(因此它超越A)。

請參閱: 陰影和覆蓋之間的差異

檢查編譯器警告:

警告1'..Program.B.callme()'隱藏繼承的成員'..Program.A.callme()'。 要使當前成員覆蓋該實現,請添加override關鍵字。 否則添加新關鍵字。 .. \\ Program.cs 44 33測試

它聲明B中的方法隱藏了A中的方法。當你在C中覆蓋方法時; 它只是覆蓋B中的方法而不是A中的方法(編譯器假定你在類B中的callme是一個新方法)。 因此,當您調用A.callme ,由於A中的方法未被覆蓋,因此返回“this is A”。

暫無
暫無

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

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