abstract (C#-Referenz)
Aktualisiert: November 2007
Der abstract-Modifizierer kann für Klassen, Methoden, Eigenschaften, Indexer und Ereignisse verwendet werden. In einer Klassendeklaration kann mit dem abstract-Modifizierer angegeben werden, dass die Klasse nur als Basisklasse anderer Klassen verwendet werden soll. Member, die als abstrakt gekennzeichnet oder in einer abstrakten Klasse enthalten sind, müssen von Klassen implementiert werden, die von der abstrakten Klasse abgeleitet sind.
Beispiel
In diesem Beispiel muss die Klasse Square eine Implementierung von Area bereitstellen, weil sie von ShapesClass abgeleitet ist:
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
Abstrakte Klassen weisen die nachstehenden Funktionen auf:
Eine abstrakte Klasse darf nicht instanziiert werden.
Eine abstrakte Klasse darf abstrakte Methoden und Accessoren enthalten.
Es ist nicht möglich, eine abstrakte Klasse unter Verwendung des sealed (C#-Referenz)-Modifizierers zu ändern, da dies bedeuten würde, dass sealed verhindert, dass die Klasse geerbt werden kann.
Eine nicht abstrakte Klasse, die von einer abstrakten Klasse abgeleitet wurde, muss Implementierungen aller vererbten abstrakten Methoden und Accessoren enthalten.
In einer Methoden- oder Eigenschaftendeklaration kann mit dem abstract-Modifizierer angegeben werden, dass die Methode bzw. Eigenschaft keine Implementierung enthält.
Abstrakte Methoden weisen die nachstehenden Features auf:
Eine abstrakte Methode stellt implizit eine virtuelle Methode dar.
Abstrakte Methodendeklarationen sind nur in abstrakten Klassen zulässig.
Da eine abstrakte Methodendeklaration keine Implementierung bereitstellt, ist kein Methodentext vorhanden. Die Methodendeklaration wird einfach mit einem Semikolon beendet, ohne dass der Signatur geschweifte Klammern ({ }) folgen. Beispiel:
public abstract void MyMethod();
Die Implementierung wird durch eine überschreibende Methode override (C#-Referenz) bereitgestellt, bei der es sich um einen Member einer nicht abstrakten Klasse handelt.
Die Modifizierer static oder virtual dürfen nicht in einer abstrakten Methodendeklaration verwendet werden.
Abstrakte Eigenschaften verhalten sich wie abstrakte Methoden, mit Ausnahme der Unterschiede bei der Deklaration und der Syntax für den Aufruf.
Der abstract-Modifizierer darf nicht für eine statische Eigenschaft verwendet werden.
Eine abstrakte geerbte Eigenschaft kann in einer abgeleiteten Klasse überschrieben werden, indem eine Eigenschaftendeklaration, die den override-Modifizierer verwendet, eingefügt wird.
Weitere Informationen zu abstrakten Klassen finden Sie unter Abstrakte und versiegelte Klassen und Klassenmember (C#-Programmierhandbuch).
Eine abstrakte Klasse muss eine Implementierung aller Schnittstellenmember bereitstellen.
Eine abstrakte Klasse, die eine Schnittstelle implementiert, ordnet die Schnittstellenmethoden möglicherweise abstrakten Methoden zu. Beispiel:
interface I
{
void M();
}
abstract class C : I
{
public abstract void M();
}
In diesem Beispiel wird die DerivedClass-Klasse von der abstrakten BaseClass-Klasse abgeleitet. Die abstrakte Klasse enthält eine abstrakte Methode (AbstractMethod) sowie zwei abstrakte Eigenschaften (X und Y).
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
Wenn Sie die abstrakte Klasse im voranstehenden Beispiel unter Verwendung einer Anweisung wie dieser instanziieren:
BaseClass bc = new BaseClass(); // Error
erhalten Sie eine Fehlermeldung, die besagt, dass der Compiler keine Instanz der abstrakten Klasse "BaseClass" erstellen kann.
C#-Programmiersprachenspezifikation
Weitere Informationen finden Sie in den folgenden Abschnitten von C#-Programmiersprachenspezifikation:
1.6.5.4 Virtuelle Methoden, Überschreibungsmethoden und abstrakte Methoden
10.1.1.1 Abstrakte Klassen