abstract (C#-Referenz)

Der abstract-Modifizierer gibt an, dass dem modifizierten Objekt eine Implementierung fehlt oder dass diese unvollständig ist. Der abstract-Modifizierer kann für Klassen, Methoden, Eigenschaften, Indexer und Ereignisse verwendet werden. Verwenden Sie den abstract-Modifizierer in einer Klassendeklaration, um anzugeben, dass die Klasse nur die Basisklasse für eine andere Klasse sein soll. Als abstrakt markierte Member oder Member in einer abstrakten Klasse müssen von Klassen, die von der abstrakten Klasse abgeleitet wurden, implementiert werden.

Beispiel

In diesem Beispiel muss die Klasse Square eine Implementierung von Area bereitstellen, da 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 folgenden Funktionen auf:

  • Eine abstrakte Klasse darf nicht instanziiert werden.

  • Eine abstrakte Klasse enthält möglicherweise abstrakte Methode und Accessoren.

  • Eine abstrakte Klasse kann nicht mit dem sealed-Modifizierer geändert werden, da sich die beiden Modifizierer gegenseitig ausschließen. Der sealed-Modifizierer verhindert das Vererben einer Klasse, und der abstract-Modifizierer erfordert das Vererben einer Klasse.

  • Eine nicht abstrakte Klasse, die von einer abstrakten Klasse abgeleitet wurde, muss Implementierungen aller geerbten abstrakten Methoden und Accessoren enthalten.

Verwenden Sie den abstract-Modifizierer in einer Methoden- oder Eigenschaftendeklaration, um anzugeben, dass die Methode oder Eigenschaft keine Implementierung enthalten.

Abstrakte Methoden weisen die folgenden Funktionen auf:

  • Eine abstrakte Methode ist implizit eine virtuelle Methode.

  • Abstrakte Methodendeklarationen sind nur in abstrakten Klassen zulässig.

  • Es gibt keinen Methodenkörper, da eine abstrakte Methodendeklaration keine Implementierungen bietet; die Methodendeklaration enden ganz einfach mit einem Semikolon; auf die Signatur folgen keine geschweiften Klammern ({ }). Beispiel:

    public abstract void MyMethod();  
    

    Die Implementierung wird von der überschreibenden Methode override zur Verfügung gestellt, die ein Member einer nicht abstrakten Klasse ist.

  • Es ist unzulässig, die Modifizierer static oder virtual in einer abstrakten Methodendeklaration zu verwenden.

Abstrakte Eigenschaften verhalten sich wie abstrakte Methoden – sie unterscheiden sich lediglich in der Deklarations- und Aufrufsyntax.

  • Es ist ein unzulässig, den abstract-Modifizierer für eine statische Eigenschaft zu verwenden.

  • Eine abstrakte vererbte Eigenschaft kann in einer abgeleiteten Klasse mithilfe der Eigenschaftendeklaration, die den Modifizierer override verwendet, außer Kraft gesetzt werden.

Weitere Informationen über abstrakte Klassen finden Sie unter Abstrakte und versiegelte Klassen und Klassenmember.

Eine abstrakte Klasse muss eine Implementierung für alle Schnittstellenmember bereitstellen.

Eine abstrakte Klasse, die eine Schnittstelle implementiert, ordnet die Schnittstellenmethoden möglicherweise abstrakten Methoden zu. Zum Beispiel:

interface I
{
    void M();
}
abstract class C : I
{
    public abstract void M();
}

Beispiel

In diesem Beispiel wird die DerivedClass-Klasse von der abstrakten Klasse BaseClass abgeleitet. Die abstrakte Klasse enthält eine abstrakte Methode, AbstractMethod, und 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 beim vorherigen Beispiel versuchen, die abstrakte Klasse mithilfe des folgenden Anweisungsbeispiels zu instanziieren:

BaseClass bc = new BaseClass();   // Error  

erhalten Sie eine Fehlermeldung, dass der Compiler keine Instanz der abstrakten Klasse „BaseClass“ erstellen kann.

C#-Programmiersprachenspezifikation

Weitere Informationen erhalten Sie unter C#-Sprachspezifikation. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.

Siehe auch

C#-Referenz
C#-Programmierhandbuch
Modifizierer
virtual
override
C#-Schlüsselwörter