• Startseite
  • Tutorials
  • Kontakt
  • Mein Account
Panjutorials
  • Startseite
  • Tutorials
  • Kontakt
  • Mein Account

Abstract in CSharp

In diesem Artikel behandeln wir den Begriff Abstract in CSharp und damit was wir damit machen können.

Bei abstract handelt es sich um einen Modifizierer . Der abstract-Modifizierer kann für Klassen, Funktionen, Eigenschaften, Indexer und Ereignisse verwendet werden. Wenn eine Funktion oder ein Interface mit dem Modifizierer abstract gekennzeichnet ist, dann muss die implementierende Klasse auch als abstract deklariert werden. Wenn eine Klasse mit abstract gekennzeichnet wird, dann ist es nicht möglich Objekte von ihr anzulegen.

Eine von einer abstrakten Klasse erbende Subklasse muss alle abstrakten Funktionen der Superklasse vollständig implementieren, sonst muss sie auch als abstract deklariert werden. Anders als bei einem Interface kann eine abstrakte Klasse auch implementierte Funktionen und Attribute, die nicht als static oder final deklariert wurden, beinhalten. Sollte man also keine Implementierung bei einer abstrakten Klasse durchführen, macht es mehr Sinn diese als Interface zu deklarieren.

Beispiel für Abstract in CSharp


abstract class Auto{

    int geschwindigkeit;   

    abstract void fahre();
}

Die Klasse Auto beinhaltet die abstrakte Funktion fahre. Da diese Methode mit abstract gekennzeichnet ist, besitzt sie keinen Funktionsrumpf. Der Funktionskopf wird direkt durch ein Semikolon beendet. Wenn eine Funktion in einer Klasse abstract ist, muss auch die Klasse selbst abstract sein. Wenn jedoch die Klasse abstract ist, müssen die Funktionen der Klasse nicht zwingend abstract sein.

Warum hat die Funktion fahre() keinen Funktionsrumpf?! Das liegt daran, dass unsere Klasse Auto in diesem Fall Abstract ist, und somit kein Objekt von ihr erstellt werden darf. Wir wissen jedoch auch, dass es sich um eine Superklasse handelt. Die Funktion fahre() muss in den Subklassen vorhanden sein und einen Funktionsrumpf erhalten.


public class BMW : Auto
{

	public void fahre(){
		Console.WriteLine("Ich fahre einen BMW!");
	}
}

Ebenso muss die Funktion fahre() in der Subklasse Audi einen Funktionsrumpf erhalten.


public class Audi {

	public void fahre() {
		Console.WriteLine("Ich fahre einen Audi!");
	}
}

Außerdem müssen wir berücksichtigen, dass die Zugriffsrechte auf die Funktion in der Subklasse identisch mit denen der Superklasse sein müssen. Wenn eine Funktion in der Superklasse also folgendermaßen erzeugt wird…


void funktion();

…, dann darf sie in der Subklasse nicht plötzlich ein public davor stehen haben.

Abstrakte Klassen weisen die folgenden 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 die beiden Modifizierer entgegengesetzte Bedeutungen haben.  Der sealed-Modifizierer verhindert, dass eine Klasse geerbt wird, und der abstract-Modifizierer erfordert, dass eine Klasse geerbt wird.  
  • Eine nicht abstrakte Klasse, die von einer abstrakten Klasse abgeleitet wurde, muss Implementierungen aller geerbten abstrakten Methoden und Accessoren enthalten.

Auszu aus der Dokumentation von Microsoft. Ich empfehle diese übrigens für weitere Details