抽象クラスとシール クラス、およびクラス メンバ (C# プログラミング ガイド)
更新 : 2007 年 11 月
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.
}
シール クラスは、基本クラスとして使用できません。このため、シール クラスは抽象クラスになることもできません。シール クラスにより、派生が防止されます。シール クラスは基本クラスとして使用できないので、実行時の最適化で、シール クラス メンバを多少高速に呼び出すことができる場合があります。
基本クラスの仮想メンバをオーバーライドしている派生クラスのクラス メンバ、メソッド、フィールド、プロパティ、またはイベントでは、そのメンバをシールとして宣言できます。これにより、その後の派生クラスでは、メンバの仮想性が無効になります。このように宣言するには、クラス メンバ宣言で override キーワードの前に sealed キーワードを配置します。次に例を示します。
public class D : C
{
public sealed override void DoWork() { }
}
参照
処理手順
方法 : 抽象プロパティを定義する (C# プログラミング ガイド)