sealed (C# リファレンス)

更新 : 2007 年 11 月

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

    class A {}    
    sealed class B : A {}

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

使用例

次の例では、C は B から継承します。しかし C は仮想関数 F をオーバーライドできません。この仮想関数は A で宣言されており、B でシールされています。

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# プログラミング ガイド)」を参照してください。

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# 言語仕様」の次のセクションを参照してください。

  • 10.1.1.2 シール クラス

  • 10.6.5 シール メソッド

解説

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

  • クラスをカスタマイズすることで派生クラスに生じ得るメリット。

  • 派生クラスがクラスを変更することによって、正しくまたは期待通り機能しなくなる可能性。

参照

概念

C# プログラミング ガイド

参照

C# のキーワード

静的クラスと静的クラス メンバ (C# プログラミング ガイド)

抽象クラスとシール クラス、およびクラス メンバ (C# プログラミング ガイド)

アクセス修飾子 (C# プログラミング ガイド)

修飾子 (C# リファレンス)

override (C# リファレンス)

virtual (C# リファレンス)

その他の技術情報

C# リファレンス