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 密封方法
備註
若要判斷是否要密封類別、方法或屬性,您應該考量下列兩點:
衍生類別可透過自訂類別的能力所得到的潛在優點。
衍生類別可修改類別的可能性,不過使用的方法可能無法正常或如預期運作。