sealed (C# 參考)

套用至類別時,sealed 修飾詞會防止其他類別繼承該類別。 在下列範例中,B 繼承自類別 A,但沒有任何類別可繼承自 B。

    class A {}    
    sealed class B : A {}

您也可以在方法或屬性上使用 sealed 修飾詞,而該方法或屬性會覆寫基底類別中的虛擬方法或屬性。 這可讓您允許從您的類別衍生類別,並防止這些類別覆寫特定的虛擬方法或屬性。

範例

在下列範例中,Z 繼承自 Y,但 Z 無法覆寫已在 X 中宣告,並在 Y 中密封的虛擬函式 F。

    class X
    {
        protected virtual void F() { Console.WriteLine("X.F"); }
        protected virtual void F2() { Console.WriteLine("X.F2"); }
    }
    class Y : X
    {
        sealed protected override void F() { Console.WriteLine("Y.F"); }
        protected override void F2() { Console.WriteLine("X.F3"); }
    }
    class Z : Y
    {
        // Attempting to override F causes compiler error CS0239.
        // protected override void F() { Console.WriteLine("C.F"); }

        // Overriding F2 is allowed.
        protected override void F2() { Console.WriteLine("Z.F2"); }
    }

當您在類別中定義新方法或屬性時,可以不將這些方法或屬性宣告為 virtual,以防止衍生類別被它們所覆寫。

搭配使用 abstract 修飾詞與密封類別會導致錯誤,因為抽象類別必須是由提供抽象方法或屬性之實作的類別所繼承。

當套用至方法或屬性時,sealed 修飾詞必須一律和 override 搭配使用。

因為結構 (Struct) 是隱含密封的,所以無法繼承。

如需詳細資訊,請參閱繼承 (C# 程式設計手冊)

如需更多範例,請參閱 抽象和密封類別以及類別成員 (C# 程式設計手冊)

    sealed class SealedClass
    {
        public int x;
        public int y;
    }

    class SealedTest2
    {
        static void Main()
        {
            SealedClass sc = new SealedClass();
            sc.x = 110;
            sc.y = 150;
            Console.WriteLine("x = {0}, y = {1}", sc.x, sc.y);
        }
    }
    // Output: x = 110, y = 150

在前一個範例中,您會使用下列陳述式從密封類別繼承:

class MyDerivedC: SealedClass {} // Error

會產生錯誤訊息:

'MyDerivedC' cannot inherit from sealed class 'SealedClass'.

C# 語言規格

如需詳細資訊,請參閱 C# 語言規格。 語言規格是 C# 語法和用法的決定性來源。

備註

若要判斷是否要密封類別、方法或屬性,您應該考量下列兩點:

  • 衍生類別可透過自訂類別的能力所得到的潛在優點。

  • 衍生類別可修改類別的可能性,不過使用的方法可能無法正常或如預期運作。

請參閱

參考

C# 關鍵字

靜態類別和靜態類別成員 (C# 程式設計手冊)

抽象和密封類別以及類別成員 (C# 程式設計手冊)

存取修飾詞 (C# 程式設計手冊)

修飾詞 (C# 參考)

override (C# 參考)

virtual (C# 參考)

概念

C# 程式設計手冊

其他資源

C# 參考