sealed (C# リファレンス)

sealed 修飾子をクラスに適用すると、それ以外のクラスが、そのクラスから継承できなくなります。 次の例では、B クラスは A クラスを継承しますが、B クラスからはどのクラスも継承できなくなります。

class A {}
sealed class B : A {}

sealed 修飾子は、基底クラスの仮想メソッドまたは仮想プロパティをオーバーライドするメソッドやプロパティで使用することもできます。 これにより、クラスの派生が行えるようになり、そのクラスが特定の仮想メソッドまたは仮想プロパティをオーバーライドできなくなります。

次の例では、ZY から継承しますが、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 修飾子は、メソッドまたはプロパティに適用するときは、常に 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

前の例で、次のステートメントを使用して、シール クラスからの継承を試みたとします。

class MyDerivedC: SealedClass {} // Error

この場合、次のエラー メッセージが表示されます。

'MyDerivedC': cannot derive from sealed type 'SealedClass'

注釈

クラス、メソッド、またはプロパティをシールするかどうかを判断するには、通常、次の 2 つの点を検討する必要があります。

  • クラスをカスタマイズすることで、派生クラスにもたらされる可能性があるメリット。

  • 派生クラスがクラスを変更することで、そのクラスが正常に、または期待どおりに機能しなくなる可能性。

C# 言語仕様

詳細については、「C# 言語の仕様」を参照してください。 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。

関連項目