次の方法で共有


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

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

sealed キーワードを使用すると、以前に仮想としてマークされていたクラスまたは特定のクラス メンバーの継承を防ぐことができます。

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

クラス定義の前にキーワード 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 キーワードの前に キーワードを配置します。 例えば次が挙げられます。

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

こちらも参照ください