sealed (C# リファレンス)
sealed 修飾子をクラスに適用すると、それ以外のクラスは継承できなくなります。次の例では、B クラスは A クラスを継承しますが、どのクラスも B クラスを継承できません。
class A {}
sealed class B : A {}
sealed 修飾子は、基本クラスの仮想メソッドまたはプロパティをオーバーライドするメソッドまたはプロパティで使用することもできます。これにより、クラスの派生が行えるようになります。また、クラスによって特定のメソッドまたはプロパティがオーバーライドされないようにします。
使用例
次の例では、Z は Y から継承します。しかし Z は仮想関数 F をオーバーライドできません。この仮想関数は X で宣言されており、Y でシールされています。
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 と共に使用される必要があります。
構造体は暗黙にシールされるため、構造体の継承はできません。
詳細については、「継承 (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# の構文と使用法に関する信頼性のある情報源です。
解説
クラス、メソッド、またはプロパティをシールするかどうかを判断するには通常、次の 2 つの点を検討する必要があります。
クラスをカスタマイズすることで派生クラスに生じ得るメリット。
派生クラスがクラスを変更することによって、正しくまたは期待通り機能しなくなる可能性。
参照
関連項目
静的クラスと静的クラス メンバー (C# プログラミング ガイド)
抽象クラスとシール クラス、およびクラス メンバー (C# プログラミング ガイド)