抽象クラスとシール クラス、およびクラス メンバー (C# プログラミング ガイド)Abstract and Sealed Classes and Class Members (C# Programming Guide)

abstract キーワードを使用すると、派生クラスで実装する必要のある不完全なクラス メンバーを作成できます。The abstract keyword enables you to create classes and class members that are incomplete and must be implemented in a derived class.

また、sealed キーワードを使用すると、既に virtual とマークされているクラスや特定のクラス メンバーを継承しないようにできます。The sealed keyword enables you to prevent the inheritance of a class or certain class members that were previously marked virtual.

抽象クラスと抽象クラス メンバーAbstract Classes and Class Members

クラス定義の前にキーワード abstract を指定することで、クラスを抽象として宣言できます。Classes can be declared as abstract by putting the keyword abstract before the class definition. 次に例を示します。For example:

public abstract class A
{
    // Class members here.
}

抽象クラスはインスタンス化できません。An abstract class cannot be instantiated. 抽象クラスの目的は、複数の派生クラスで共有できる基底クラスの共通の定義を提供することです。The purpose of an abstract class is to provide a common definition of a base class that multiple derived classes can share. たとえば、クラス ライブラリでは、その多くの関数のパラメーターとして使用される抽象クラスを定義できます。このライブラリを使用する場合は、派生クラスを作成してクラスの独自の実装を提供する必要があります。For example, a class library may define an abstract class that is used as a parameter to many of its functions, and require programmers using that library to provide their own implementation of the class by creating a derived class.

抽象クラスでは、抽象メソッドも定義できます。Abstract classes may also define abstract methods. 抽象メソッドを定義するには、メソッドの戻り値の型の前に abstract キーワードを記述します。This is accomplished by adding the keyword abstract before the return type of the method. 次に例を示します。For example:

public abstract class A
{
    public abstract void DoWork(int i);
}

抽象メソッドには実装がないので、メソッド定義の後に、通常のメソッド ブロックの代わりにセミコロン (;) を配置します。Abstract methods have no implementation, so the method definition is followed by a semicolon instead of a normal method block. 抽象クラスの派生クラスでは、すべての抽象メソッドを実装する必要があります。Derived classes of the abstract class must implement all abstract methods. 抽象クラスが基底クラスから仮想メソッドを継承した場合は、この抽象クラスでは抽象メソッドで仮想メソッドをオーバーライドできます。When an abstract class inherits a virtual method from a base class, the abstract class can override the virtual method with an abstract method. 次に例を示します。For example:

// compile with: -target:library
public class D
{
    public virtual void DoWork(int i)
    {
        // Original implementation.
    }
}

public abstract class E : D
{
    public abstract override void DoWork(int i);
}

public class F : E
{
    public override void DoWork(int i)
    {
        // New implementation.
    }
}

virtual メソッドが abstract として宣言されている場合、そのメソッドは、その抽象クラスを継承するどのクラスでも仮想になります。If a virtual method is declared abstract, it is still virtual to any class inheriting from the abstract class. 抽象メソッドを継承するクラスでは、そのメソッドの元の実装にアクセスできません。上の例では、クラス F の DoWork は、クラス D の DoWork を呼び出すことができません。このようにして抽象クラスは、派生クラスに対し、仮想メソッドの新しいメソッド実装を強制的に提供させることができます。A class inheriting an abstract method cannot access the original implementation of the method—in the previous example, DoWork on class F cannot call DoWork on class D. In this way, an abstract class can force derived classes to provide new method implementations for virtual methods.

シール クラスとシール クラス メンバーSealed Classes and Class Members

クラス定義の前にキーワード sealed を指定することで、クラスを sealed として宣言できます。Classes can be declared as sealed by putting the keyword sealed before the class definition. 次に例を示します。For example:

public sealed class D
{
    // Class members here.
}

シール クラスは、基底クラスとして使用できません。A sealed class cannot be used as a base class. このため、シール クラスは抽象クラスになることもできません。For this reason, it cannot also be an abstract class. シール クラスにより、派生が防止されます。Sealed classes prevent derivation. シール クラスは基底クラスとして使用できないので、実行時の最適化で、シール クラス メンバーを多少高速に呼び出すことができる場合があります。Because they can never be used as a base class, some run-time optimizations can make calling sealed class members slightly faster.

基底クラスの仮想メンバーをオーバーライドしている派生クラスのメソッド、インデクサー、プロパティ、またはイベントでは、そのメンバーをシールとして宣言できます。A method, indexer, property, or event, on a derived class that is overriding a virtual member of the base class can declare that member as sealed. これにより、その後の派生クラスでは、メンバーの仮想性が無効になります。This negates the virtual aspect of the member for any further derived class. このように宣言するには、クラス メンバー宣言で override キーワードの前に sealed キーワードを配置します。This is accomplished by putting the sealed keyword before the override keyword in the class member declaration. 次に例を示します。For example:

public class D : C
{
    public sealed override void DoWork() { }
}

関連項目See also