sealed (C# リファレンス)sealed (C# Reference)

sealed 修飾子をクラスに適用すると、それ以外のクラスが、そのクラスから継承できなくなります。When applied to a class, the sealed modifier prevents other classes from inheriting from it. 次の例では、B クラスは A クラスを継承しますが、B クラスからはどのクラスも継承できなくなります。In the following example, class B inherits from class A, but no class can inherit from class B.

class A {}
sealed class B : A {}

sealed 修飾子は、基底クラスの仮想メソッドまたは仮想プロパティをオーバーライドするメソッドやプロパティで使用することもできます。You can also use the sealed modifier on a method or property that overrides a virtual method or property in a base class. これにより、クラスの派生が行えるようになり、そのクラスが特定の仮想メソッドまたは仮想プロパティをオーバーライドできなくなります。This enables you to allow classes to derive from your class and prevent them from overriding specific virtual methods or properties.

Example

次の例では、ZY から継承しますが、Z は仮想関数 F をオーバーライドできません。この仮想関数は X で宣言されており、Y でシールされています。In the following example, Z inherits from Y but Z cannot override the virtual function F that is declared in X and sealed in 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 として宣言しないようにします。When you define new methods or properties in a class, you can prevent deriving classes from overriding them by not declaring them as virtual.

abstract 修飾子をシール クラスで使用するとエラーになります。抽象メソッドまたは抽象プロパティを実装するクラスでは、抽象クラスを継承する必要があるためです。It is an error to use the abstract modifier with a sealed class, because an abstract class must be inherited by a class that provides an implementation of the abstract methods or properties.

sealed 修飾子は、メソッドまたはプロパティに適用するときは、常に override と一緒に使用する必要があります。When applied to a method or property, the sealed modifier must always be used with override.

構造体は暗黙的にシールされるため、継承できません。Because structs are implicitly sealed, they cannot be inherited.

詳細については、「継承」を参照してください。For more information, see Inheritance.

上記以外の例については、「抽象クラスとシール クラス、およびクラス メンバー」を参照してください。For more examples, see Abstract and Sealed Classes and Class Members.

Example

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

前の例で、次のステートメントを使用して、シール クラスからの継承を試みたとします。In the previous example, you might try to inherit from the sealed class by using the following statement:

class MyDerivedC: SealedClass {} // Error

この場合、次のエラー メッセージが表示されます。The result is an error message:

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

解説Remarks

クラス、メソッド、またはプロパティをシールするかどうかを判断するには、通常、次の 2 つの点を検討する必要があります。To determine whether to seal a class, method, or property, you should generally consider the following two points:

  • クラスをカスタマイズすることで、派生クラスにもたらされる可能性があるメリット。The potential benefits that deriving classes might gain through the ability to customize your class.

  • 派生クラスがクラスを変更することで、そのクラスが正常に、または期待どおりに機能しなくなる可能性。The potential that deriving classes could modify your classes in such a way that they would no longer work correctly or as expected.

C# 言語仕様C# language specification

詳細については、「C# 言語の仕様」を参照してください。For more information, see the C# Language Specification. 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。The language specification is the definitive source for C# syntax and usage.

関連項目See also