sealed (C# 參考)

更新:2007 年 11 月

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

    class A {}    
    sealed class B : A {}

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

範例

在下列範例中,C 繼承自 B,但 C 無法覆寫已在 A 中宣告,並在 B 中密封的虛擬函式 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# 程式設計手冊)

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# 語言規格中的下列章節:

  • 10.1.1.2 密封類別

  • 10.6.5 密封方法

備註

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

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

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

請參閱

概念

C# 程式設計手冊

參考

C# 關鍵字

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

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

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

修飾詞 (C# 參考)

override (C# 參考)

virtual (C# 參考)

其他資源

C# 參考