關於C#的virtual,Override和new的坑



先看這麼一段代碼:

    public class Base
    {
        public virtual void DoWork( int a) { Console.WriteLine( "base dowork"); }
    }

    public class Derived : Base
    {
        public override void DoWork( int a) { Console.WriteLine( "Derived dowork"); }
        public void DoWork(double a) { Console.WriteLine( "Derived dowork doubletype" ); }
    }

下面這樣調用它
int val = 5;
Derived d = new Derived();
d.DoWork(val);

請問,結果是什麼,你猜猜?

我之前是學C++的,我的第一反應就是“Derived dowork”。這要是一段C++代碼,那確實是這樣,但這是C#。

結果是:Derived dowork doubletype

恩,爲什麼會這樣呢?

C# 編譯器將首先嚐試使該調用與最初在 Derived 上聲明的 DoWork 版本兼容。 重寫方法不被視爲是在類上進行聲明的,而是在基類上聲明的方法的新實現。 僅當 C# 編譯器無法將方法調用與 Derived 上的原始方法匹配時,它才嘗試將該調用與具有相同名稱和兼容參數的重寫方法匹配。

C# 語言經過專門設計,以便不同庫中的基類與派生類之間的版本控制可以不斷向前發展,同時保持向後兼容。 這具有多方面的意義。例如,這意味着在基類中引入與派生類中的某個成員具有相同名稱的新成員在 C# 中是完全支持的,不會導致意外行爲。 它還意味着類必須顯式聲明某方法是要重寫一個繼承方法,還是一個隱藏具有類似名稱的繼承方法的新方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章