C#關鍵字掃盲——Virtual 虛擬

Virtual

virtual
官方描述:關鍵字用於修改方法、屬性、索引器或事件聲明,並使它們可以在派生類中被重寫。

配合的關鍵字

override
官方描述:擴展或修改繼承的方法、屬性、索引器或事件的抽象或虛擬實現需要 override 修飾符。

new
修飾符 官方描述:在用作聲明修飾符時,new 關鍵字可以顯式隱藏從基類繼承的成員。 隱藏繼承的成員時,該成員的派生版本將替換基類版本。 雖然可以不使用 new 修飾符來隱藏成員,但將收到編譯器警告。 如果使用 new 來顯式隱藏成員,將禁止此警告。(new有很多用途,這裏主要用作於修飾符)


項目源碼地址:https://gitee.com/michel4liu/LearnCSharp.git
項目:LearnVirtual
環境VS2017 .NET Core2.0


virtual+override 比較常見的用法

    static void Main(string[] args)
    {
            Father f = new Father();
            f.DoSomething();//輸出 Father.Work

            Son s = new Son();
            s.DoSomething();//輸出 Son.Learn

            Father fs = new Son();
            fs.DoSomething();//輸出 Son.Learn
    }

    class Father
    {
        public virtual void DoSomething()
        {
            Console.WriteLine($"{nameof(Father)}.Work");
        }
    }

    class Son : Father
    {
        public override void DoSomething()
        {
            Console.WriteLine($"{nameof(Son)}.Learn");
        }
    }

重點在於第三個輸出
Father fs = new Son();
fs.DoSomething(); //輸出 Son.Learn
因 Son 利用關鍵字 override 重寫 DoSomething() 所以用Father聲明接收時也能指向Son.DoSomething()

virtual+New

    static void Main(string[] args)
    {
            Father f = new Father();
            f.DoSomething();//輸出 Father.Work

            Son s = new Son();
            s.DoSomething();//輸出 Son.Learn

            Father fs = new Son();
            fs.DoSomething();//輸出 Father.Learn
    }

    class Father
    {
        public virtual void DoSomething()
        {
            Console.WriteLine($"{nameof(Father)}.Work");
        }
    }

    class Son : Father
    {
        public new void DoSomething()
        {
            Console.WriteLine($"{nameof(Son)}.Learn");
        }
    }

重點在於第三個輸出
Father fs = new Son();
fs.DoSomething(); //輸出 Son.Learn
因 Son 利用關鍵字 new 隱藏繼承DoSomething() 所以用Father聲明接收Son對象時只能指向Father.DoSomething()


注意點

  1. 如果Father和Son 中都不指定virtual、override 、new 關鍵字,編譯默認使用new,編譯器會報警告。
  2. New和Override 關鍵字互斥的。不可以同時使用。
  3. New重寫後能通過轉換(如獲取父對象調用或base.方法())找到基類的方法,Override 重寫後則無法找到基類方法。
發佈了40 篇原創文章 · 獲贊 29 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章