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

C# 密封類別與密封成員:禁止繼承與覆寫的完整控制

     編輯:關於C語言

密封成員(sealed override)

當衍生類別覆寫虛擬方法時,可加上 sealed 禁止後續衍生類別再次覆寫:

class Parent {
    public virtual void Method1() { Console.WriteLine("Method1"); }
    public virtual void Method2() { Console.WriteLine("Method2"); }
    public virtual void Method3() { Console.WriteLine("Method3"); }
}

class Child1 : Parent {
    public override void Method1() { Console.WriteLine("New Method1"); }
    public override void Method2() { Console.WriteLine("New Method2"); }
    // 封鎖 Method3,後代無法再覆寫
    public sealed override void Method3() { Console.WriteLine("New Method3"); }
}

// 密封類別:完全禁止繼承
sealed class Child2 : Child1 {
    public override void Method1() { Console.WriteLine("New New Method1"); }
    public sealed override void Method2() { Console.WriteLine("New New Method2"); }
    // 編譯錯誤:無法覆寫 sealed 方法
    // public override void Method3() { }
}

class Program {
    static void Main() {
        Child2 obj = new Child2();
        obj.Method1(); // New New Method1
        obj.Method2(); // New New Method2
        obj.Method3(); // New Method3 (來自 Child1)
        Console.ReadKey();
    }
}

關鍵規則總結

修飾詞適用對象效果
sealed class類別禁止被繼承,隱含所有虛擬方法皆視為 sealed
sealed override方法/屬性禁止後續衍生類別覆寫,必須搭配 override
virtual方法/屬性允許覆寫,預設非 sealed

設計指南

  • 類別預設不密封:除非有強烈理由(安全性、效能、不可變設計),否則保持可繼承性。
  • 方法謹慎密封:僅在確定演算法不應被修改時使用(如核心驗證邏輯、安全檢查)。
  • 文檔說明原因:在 XML 註解中標註 <remarks>Sealed because...</remarks>。
  • 效能微益:JIT 可對 sealed 方法進行非虛擬呼叫優化,但現代 Runtime 已大幅優化虛擬呼叫,效能增益通常可忽略。

常見誤區

  1. 誤以為 sealed class 所有方法自動 sealed:只有繼承自基底的虛擬方法會隱式 sealed;類別自行定義的新虛擬方法仍可被覆寫(但 sealed class 無法被繼承,所以實際上無法覆寫)。
  2. 混淆 sealed 與 private:private virtual 在 C# 中非法;密封是針對繼承鏈,而非存取層級。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved