abstract (C# リファレンス)
更新 : 2007 年 11 月
abstract 修飾子は、クラス、メソッド、プロパティ、インデクサ、およびイベントで使用できます。クラスの宣言に abstract 修飾子を使用した場合、クラスは他のクラスの基本クラスとなることだけを目的とします。抽象としてマークされているメンバ、または抽象クラスのメンバは、抽象クラスから派生したクラスを使用して実装する必要があります。
使用例
この例では、Square クラスは ShapesClass から派生したクラスであるので、このクラスにより Area が実装されます。
abstract class ShapesClass
{
abstract public int Area();
}
class Square : ShapesClass
{
int side = 0;
public Square(int n)
{
side = n;
}
// Area method is required to avoid
// a compile-time error.
public override int Area()
{
return side * side;
}
static void Main()
{
Square sq = new Square(12);
Console.WriteLine("Area of the square = {0}", sq.Area());
}
interface I
{
void M();
}
abstract class C : I
{
public abstract void M();
}
}
// Output: Area of the square = 144
抽象クラスには、以下に示す特徴があります。
抽象クラスはインスタンス化できません。
抽象クラスは、抽象メソッドおよび抽象アクセサを含む可能性があります。
抽象クラスを sealed (C# リファレンス) 修飾子で修飾することはできません。これは、sealed によりクラスの継承が無効になるためです。
抽象クラスから派生される非抽象クラスは、継承される抽象メソッドおよび抽象アクセサの実際の実装をすべて含んでいる必要があります。
abstract 修飾子をメソッド宣言またはプロパティ宣言に使用すると、メソッドまたはプロパティに実装を含まないことを示します。
抽象メソッドには、以下に示す特徴があります。
抽象メソッドは、暗黙的に virtual なメソッド (仮想メソッド) です。
抽象メソッドの宣言は、抽象クラス内でだけ許可されます。
抽象メソッドの宣言では実際の実装は用意されないので、メソッドの本体はなく、メソッドの宣言は単にセミコロンで終わり、シグネチャに続く中かっこ ({ }) はありません。次に例を示します。
public abstract void MyMethod();
メソッドの実装は、非抽象クラスのメンバとしてオーバーライドされたメソッド (override (C# リファレンス)) によって提供されます。
抽象プロパティは抽象メソッドと同様に動作しますが、宣言の構文および呼び出しの構文に相違があります。
静的プロパティで abstract 修飾子を使用するのはエラーです。
継承された抽象プロパティを派生クラス内でオーバーライドできます。オーバーライドするには、override 修飾子を使用するプロパティ宣言を含めます。
抽象クラスの詳細については、「抽象クラスとシール クラス、およびクラス メンバ (C# プログラミング ガイド)」を参照してください。
抽象クラスは、すべてのインターフェイス メンバの実装を用意する必要があります。
インターフェイスを実装する抽象クラスは、抽象メソッドにインターフェイス メソッドを割り当てることもあります。次に例を示します。
interface I
{
void M();
}
abstract class C : I
{
public abstract void M();
}
この例では、DerivedClass クラスは抽象クラス BaseClass の派生クラスです。この抽象クラスには AbstractMethod という抽象メソッドと、X および Y という 2 つの抽象プロパティがあります。
abstract class BaseClass // Abstract class
{
protected int _x = 100;
protected int _y = 150;
public abstract void AbstractMethod(); // Abstract method
public abstract int X { get; }
public abstract int Y { get; }
}
class DerivedClass : BaseClass
{
public override void AbstractMethod()
{
_x++;
_y++;
}
public override int X // overriding property
{
get
{
return _x + 10;
}
}
public override int Y // overriding property
{
get
{
return _y + 10;
}
}
static void Main()
{
DerivedClass o = new DerivedClass();
o.AbstractMethod();
Console.WriteLine("x = {0}, y = {1}", o.X, o.Y);
}
}
// Output: x = 111, y = 161
上の例で、次に示すようなステートメントを使用して抽象クラスのインスタンスの作成を試みるとします。
BaseClass bc = new BaseClass(); // Error
コンパイラが 'BaseClass' 抽象クラスのインスタンスを作成できないことを知らせるエラーが表示されます。
C# 言語仕様
詳細については、「C# 言語仕様」の次のセクションを参照してください。
1.6.5.4 仮想メソッド、オーバーライド メソッド、抽象メソッド
10.1.1.1 抽象クラス