Vererbung
Einleitung
Vererbung ist ein zentrales Konzept der objektorientierten Programmierung. Es wird verwendet, wenn man Objekte verwalten will, die die gleiche Basisfunktionalität bieten und gleichzeitig verschiedene spezielle Ausprägungen haben.
Durch Vererbung erreicht man, dass Properties und Methoden, die für alle Klassen der Vererbungshierarchie gleich funktionieren, nur einmal in der Basisklasse definiert werden müssen.
Alle abgeleiteten Klassen haben Zugriff auf die Properties und Methoden der Basisklasse, solange diese nicht private
sind.
Begriffe: Ableitung und Vererbung
Folgende Ausdrucksweisen sind gleichbedeutend:
- Die Klasse
Fahrzeug
vererbt anMotorrad
undAuto
- Die Klassen
Motorrad
undAuto
leiten vonFahrzeug
ab. - Die Klassen
Motorrad
undAuto
erben vonFahrzeug
. - Englisch:
Inheritance
= Vererbung,to derive
= ableiten
Eine Klasse die an andere Klassen vererbt nennt man auch Basisklasse. Eine Klasse die von einer anderen Klasse ableitet nennt man auch abgeleitete Klasse.
Darstellung in der UML
In der UML (Unified Modelling Language) wird Vererbung dargestellt durch zwei Klassen, die durch einen Pfeil verbunden sind, wobei die Pfeilspitze ein nicht ausgefülltes Dreieck ist. Abgeleitete Klassen beinhalten nur die Properties und Methoden die neu hinzukommen. Vererbte Properties und Methoden werden nicht noch einmal angeführt.
Abstrakte Basisklassen
Manchmal möchte man Basisklassen erstellen, um dort die Dinge zu definieren, die für abgeleitete Klassen gleich sein sollen, jedoch ohne eine Möglichkeit zu bieten die Basisklasse selbst zu instanziieren.
Dafür kann man die Basisklasse als abstract
markieren:
Abstrakte Basisklassen bieten auch die Möglichkeit Methoden als abstrakt zu definieren.
Damit können bereits in der Basisklasse Methoden definiert werden, ohne jedoch eine Implementierung anzugeben.
Damit sagt man: Jede Klasse die von dieser Klasse ableitet, muss diese Methode implementieren, oder selbst auch wieder eine abstrakte Klasse sein.
Abgeleitete Klassen verwenden beim Implementieren der Methode das Schlüsselwort override
.
Vererbungshierarchie
Vererbung ist nicht auf eine Ebene beschränkt. Abgeleitete Klassen können wiederum Basisklassen für andere Klassen sein. Es gibt keine Einschränkung wie oft abgeleitet werden kann.
Mehrfachvererbung
Mehrfachvererbung bedeutet, dass eine Klasse von mehreren Basisklassen ableiten kann. In C# ist Mehrfachvererbung nicht erlaubt. Eine Klasse kann immer nur von genau einer Basisklasse ableiten.
Polymorphismus
In den Code-Bespielen oben ist dir vielleicht folgende Zeile aufgefallen:
Wir haben eine Variable vom Typ Tier
definiert, dieser Variable wurde jedoch kein Tier zugewiesen, sondern eine Objektinstanz vom Typ Hund
.
Dieses Beispiel zeigt Polymorphismus. Der Begriff steht für “Vielgestaltigkeit” und meint, dass eine Variable mehrere unterschiedliche Ausprägungen annehmen kann.
C# ist eine statisch typisierte Sprache. Das bedeutet, dass zur Compile-Zeit bereits festgelegt ist, welchen Datentyp eine Variable aufnehmen kann.
In diesem Beispiel ist der statische Datentyp Tier
.
Polymorphismus ermöglicht es jedoch, dass die Variable nicht nur genau den angegeben Datentyp aufnehmen kann, sondern auch jeglichen davon abgeleiteten Datentyp.
In diesem Beispiel ist der dynamische Datentyp Hund
.
Achtung, Polymorphismus funktioniert nur in eine Richtung. Die Variable eines statischen Datentyps kann den Datentyp selbst, oder eine abgeleitete Klasse aufnehmen, nicht jedoch eine Basisklasse.
Dynamische Bindung
Wird eine abstrakte Methode einer Basisklasse aufgerufen, oder eine Methode die mit dem Schlüsselwort virtual
versehen wurde,
so wird dynamische Bindung ermöglicht. Das bedeutet, dass beim Aufruf der Methode, nicht zwingend die Methode des statischen Datentyps aufgerufen wird, sondern diejenige des dynamischen Datentyps.
Dank Polymorphismus müssen die beiden ja nicht übereinstimmen.