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("Y.F2"); }
}
class Z : Y
{
// Attempting to override F causes compiler error CS0239.
// protected override void F() { Console.WriteLine("Z.F"); }
// Overriding F2 is allowed.
protected override void F2() { Console.WriteLine("Z.F2"); }
}
新しいメソッドまたはプロパティをクラスで定義するときに、派生クラスによるオーバーライドを防ぐには、その派生クラスを virtual として宣言しないようにします。
abstract 修飾子をシール クラスで使用するとエラーになります。抽象メソッドまたは抽象プロパティを実装するクラスでは、抽象クラスを継承する必要があるためです。
sealed
修飾子は、メソッドまたはプロパティに適用するときは、常に override と一緒に使用する必要があります。
構造体は暗黙的にシールされるため、継承できません。
詳細については、「継承」を参照してください。
上記以外の例については、「抽象クラスとシール クラス、およびクラス メンバー」を参照してください。
sealed class SealedClass
{
public int x;
public int y;
}
class SealedTest2
{
static void Main()
{
var sc = new SealedClass();
sc.x = 110;
sc.y = 150;
Console.WriteLine($"x = {sc.x}, y = {sc.y}");
}
}
// Output: x = 110, y = 150
前の例で、次のステートメントを使用して、シール クラスからの継承を試みたとします。
class MyDerivedC: SealedClass {} // Error
この場合、次のエラー メッセージが表示されます。
'MyDerivedC': cannot derive from sealed type 'SealedClass'
注釈
クラス、メソッド、またはプロパティをシールするかどうかを判断するには、通常、次の 2 つの点を検討する必要があります。
クラスをカスタマイズすることで、派生クラスにもたらされる可能性があるメリット。
派生クラスがクラスを変更することで、そのクラスが正常に、または期待どおりに機能しなくなる可能性。
C# 言語仕様
詳細については、「C# 言語の仕様」を参照してください。 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。
関連項目
.NET