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("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
メンバーをオーバーライドすると、次の例のように sealed キーワードを使用して派生型がオーバーライドされないようにすることができます。
public sealed override string ToString() => Value;
抽象クラスは抽象メソッドまたはプロパティの実装を提供するクラスによって継承される必要があるため、抽象 修飾子をシール クラスと共に使用するとエラーになります。
メソッドまたはプロパティに適用する場合、sealed
修飾子は常に オーバーライドと共に使用する必要があります。
構造体は暗黙的にシールされるため、継承できません。
詳細については、「継承」を参照してください。
その他の例については、「抽象クラスとシールドクラスとクラスメンバー 」を参照してください。
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
前の例では、次のステートメントを使用して、sealed クラスから継承しようとする場合があります。
class MyDerivedC: SealedClass {} // Error
結果は次のエラー メッセージです。
'MyDerivedC': cannot derive from sealed type 'SealedClass'
Remarks
クラス、メソッド、またはプロパティをシールするかどうかを決定するには、通常、次の 2 つの点を考慮する必要があります。
クラスをカスタマイズする機能によって派生クラスが得られる可能性のある利点。
派生クラスが、正しく動作しなくなったり、期待どおりに動作しなくなったりするようにクラスを変更する可能性があります。
C# 言語仕様
詳細については、C# 言語仕様のを参照してください。 言語仕様は、C# の構文と使用法の決定的なソースです。
関連項目
.NET