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

abstract キーワードを使用すると、派生クラスで実装する必要のある不完全なクラス メンバーを作成できます。

また、sealed キーワードを使用すると、既に virtual とマークされているクラスや特定のクラス メンバーを継承しないようにできます。

抽象クラスと抽象クラス メンバー

クラス定義の前にキーワード abstract を指定することで、クラスを抽象として宣言できます。 次に例を示します。

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

抽象クラスはインスタンス化できません。 抽象クラスの目的は、複数の派生クラスで共有できる基底クラスの共通の定義を提供することです。 たとえば、クラス ライブラリでは、その多くの関数のパラメーターとして使用される抽象クラスを定義できます。このライブラリを使用する場合は、派生クラスを作成してクラスの独自の実装を提供する必要があります。

抽象クラスでは、抽象メソッドも定義できます。 抽象メソッドを定義するには、メソッドの戻り値の型の前に abstract キーワードを記述します。 次に例を示します。

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

抽象メソッドには実装がないので、メソッド定義の後に、通常のメソッド ブロックの代わりにセミコロン (;) を配置します。 抽象クラスの派生クラスでは、すべての抽象メソッドを実装する必要があります。 抽象クラスが基底クラスから仮想メソッドを継承した場合は、この抽象クラスでは抽象メソッドで仮想メソッドをオーバーライドできます。 次に例を示します。

// 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 として宣言されている場合、そのメソッドは、その抽象クラスを継承するどのクラスでも仮想になります。 抽象メソッドを継承するクラスでは、そのメソッドの元の実装にアクセスできません。上の例では、クラス F の DoWork は、クラス D の DoWork を呼び出すことができません。このようにして抽象クラスは、派生クラスに対し、仮想メソッドの新しいメソッド実装を強制的に提供させることができます。

シール クラスとシール クラス メンバー

クラス定義の前にキーワード を指定することで、クラスを sealed として宣言できます。 次に例を示します。

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

シール クラスは、基底クラスとして使用できません。 このため、シール クラスは抽象クラスになることもできません。 シール クラスにより、派生が防止されます。 シール クラスは基底クラスとして使用できないので、実行時の最適化で、シール クラス メンバーを多少高速に呼び出すことができる場合があります。

基底クラスの仮想メンバーをオーバーライドしている派生クラスのメソッド、インデクサー、プロパティ、またはイベントでは、そのメンバーをシールとして宣言できます。 これにより、その後の派生クラスでは、メンバーの仮想性が無効になります。 このように宣言するには、クラス メンバー宣言で sealed キーワードの前に sealed キーワードを配置します。 次に例を示します。

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

関連項目