首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# abstract、virtual、override 關鍵字深度解析 (2/3)

     編輯:關於C語言

override 修飾詞規則

  • 只能覆寫 virtual、abstract 或 override 成員。
  • 不可覆寫 non-virtual 或 static 方法。
  • 覆寫成員與被覆寫成員必須擁有相同簽名、存取層級。
  • 不可使用 new、static、virtual、abstract 修飾 override 方法。

程式碼範例:虛擬方法 vs 一般方法

class Base
{
    public void RealMethod() => Console.WriteLine("Base.RealMethod");
    public virtual void VirtualMethod() => Console.WriteLine("Base.VirtualMethod");
}

class Derived : Base
{
    // 隱藏一般方法 (非多型)
    new public void RealMethod() => Console.WriteLine("Derived.RealMethod (new)");

    // 覆寫虛擬方法 (多型)
    public override void VirtualMethod() => Console.WriteLine("Derived.VirtualMethod (override)");
}

class Test
{
    static void Main()
    {
        Base b = new Base();
        Derived d = new Derived();

        b.RealMethod();      // Base.RealMethod
        d.RealMethod();      // Derived.RealMethod (new)
        b.VirtualMethod();   // Base.VirtualMethod
        d.VirtualMethod();   // Derived.VirtualMethod (override)

        Console.WriteLine();

        // 多型行為展示
        b = d;
        b.RealMethod();      // Base.RealMethod (靜態繫結,隱藏不生效)
        b.VirtualMethod();   // Derived.VirtualMethod (動態繫結,override 生效)
    }
}

執行結果解析

Base.RealMethod
Derived.RealMethod (new)
Base.VirtualMethod
Derived.VirtualMethod (override)

Base.RealMethod          ← 隱藏成員不具多型
Derived.VirtualMethod    ← 覆寫成員具多型

核心觀念

  • new (隱藏):**編譯期靜態繫結**,參考型別決定呼叫哪個版本。
  • override (覆寫):**執行期動態繫結**,實際物件型別決定呼叫哪個版本。
  • 設計時:預期衍生類需多型擴充 → virtual + override;單純取代實作無多型需求 → new。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved