sealed修飾子をクラスに適用すると、他のクラスがそのクラスから継承されなくなります。 次の例では、クラス B はクラス Aから継承しますが、クラス Bから継承できるクラスはありません。
class A {}
sealed class B : A {}
基底クラスの仮想メソッドまたはプロパティをオーバーライドするメソッドまたはプロパティに対して、sealed 修飾子を使用することもできます。 この方法を使用すると、開発者はクラスからクラスを派生させ、特定の仮想メソッドまたはプロパティをオーバーライドできないようにすることができます。
C# 言語リファレンスには、C# 言語の最新リリース バージョンが記載されています。 また、今後の言語リリースのパブリック プレビューの機能に関する初期ドキュメントも含まれています。
このドキュメントでは、言語の最後の 3 つのバージョンまたは現在のパブリック プレビューで最初に導入された機能を特定します。
ヒント
C# で機能が初めて導入された時期を確認するには、 C# 言語バージョン履歴に関する記事を参照してください。
次の例では、ZはYから継承しますが、ZXで宣言され、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'
クラス、メソッド、またはプロパティをシールするかどうかを決定するには、通常、次の 2 つの点を考慮します。
- クラスをカスタマイズする機能によって派生クラスが得られる可能性のある利点。
- 派生クラスが正しく動作しなくなったか、期待どおりにクラスが変更される可能性があります。
C# 言語仕様
詳細については、C# 言語仕様のを参照してください。 言語仕様は、C# の構文と使用法の決定的なソースです。
関連項目
.NET