In der Objektorientierung ist Vererbung eine Vorgehensweise, neue Konstrukte (Klassen bzw. Prototypen) unter Verwendung von bestehenden hierarchisch aufzubauen. In diesem Artikel wird zur Vereinfachung die Terminologie bei der Vererbung in Klassenstrukturen benutzt. Die gleichen Prinzipien gelten aber durchaus auch für die Vererbung bei prototypenbasierter Objektorientierung.
Bei der Vererbung ist zwischen Schnittstellenvererbung und Implementationsvererbung zu unterscheiden. Bei der Schnittstellenvererbung erbt eine abgeleitete Klasse die Signaturen von Methoden, muss die Methoden aber selbst implementieren. Bei der Implementationsvererbung erbt die abgeleitete Klasse auch die Implementierung von einer oder mehreren Basisklassen bzw. die Implementierung des Prototypen.
Inhaltsverzeichnis |
Die Definition einer neuen Klasse kann gegebenenfalls auf der Definition einer bereits vorhandenen Klasse aufbauen, so dass die neue Klasse die Merkmale der vorhandenen übernimmt und um neue Bestandteile ergänzt. Die Übernahme der Merkmale der vorhandenen Klasse bezeichnet man als Vererbung.
Überdeckt ein neues Merkmal ein bei der Vererbung übernommenes Merkmal, dann spricht man von Überschreiben.
Die Nutzung der Vererbung bietet sich an, wenn es Klassen gibt, die konzeptionell aufeinander aufbauen. Gegebenenfalls lassen sich Klassendefinitionen von vorneherein so aufteilen, dass identische Merkmale in der Definition einer vererbenden Klasse zusammengefasst werden.
Vererbungsbeziehungen zwischen Klassen werden in der Regel mit Hilfe von Klassendefinitionen hergestellt. Dabei bezeichnet man die vererbende Klasse als Basisklasse oder auch Superklasse und die erbende Klasse als abgeleitete Klasse bzw. Subklasse.
Eine besondere Bedeutung haben dabei abstrakte Klassen. Eine abstrakte Klasse definiert Schnittstellen für Methoden und Eigenschaften, ohne die zugehörige Implementierung zur Verfügung zu stellen, so dass es nicht möglich ist, Objekte daraus zu generieren. Erst von daraus abgeleiteten Klassen können, sofern entsprechende Implementierungen der Methoden bzw. Eigenschaften zur Verfügung gestellt werden, Objekte generiert werden.
Ein Fahrzeug besitzt bestimmte Attribute, diese können z.B. Höchstgeschwindigkeit, maximale Zuladung oder auch Farbe sein. Die Klasse Kraftfahrzeug erbt all diese Attribute, kann aber noch zusätzliche Attribute besitzen, z.B. Leistung oder Drehmoment. Des Weiteren kann ein Kraftfahrzeug auch zusätzliche Methoden wie Beschleunigen besitzen, welche die Basisklasse Fahrzeug nicht kennt.
Die Klasse Personenkraftwagen kann dann wiederum von Kraftfahrzeug abgeleitet werden und weitere zusätzliche Attribute wie Anzahl der Sitze besitzen. Durch die Ableitung von Kraftfahrzeug erbt der Personenkraftwagen automatisch alle Attribute von Fahrzeug.
Ob eine Klasse in einer Vererbungsbeziehung zu einer anderen Klasse steht, lässt sich durch eine einfache Ist-Ein-Regel feststellen. Sobald die Aussage „(Objekt der abgeleiteten Klasse) ist ein (Objekt der Basisklasse)“ zutrifft, stehen beide Klassen in einer Vererbungsbeziehung.
Hat ein bezeichnet also Attribute einer Klasse.
Von Mehrfachvererbung - im Unterschied zur Mehrstufigen Vererbung - spricht man, wenn eine Klasse von mehreren Klassen unmittelbar erbt.
Ein Anwendungsbeispiel hierfür ist die Modellierung eines Amphibienfahrzeugs, das sowohl die Attribute von Landfahrzeug als auch die von Wasserfahrzeug erbt. Damit besitzt Amphibienfahrzeug sowohl eine Räderzahl als auch einen Tiefgang.
Nur wenige Programmiersprachen bieten die Möglichkeit der Mehrfach-Klassenvererbung, zum Beispiel C++, CLOS, Eiffel, Perl und Python. Als Einwand gegen Mehrfach-Klassenvererbung wird häufig genannt, dass sie das Design unnötig kompliziert und undurchsichtig machen können. So kann es dadurch zu Mehrdeutigkeiten im Rahmen des Diamond-Problems kommen. Bei einigen Programmiersprachen, wie zum Beispiel Oberon und dessen Weiterentwicklungen wurde daher bewusst auf die Möglichkeit der mehrfachen Implementationsvererbung verzichtet, was durch die Verwendung von Zwillingsklassen kompensiert werden kann[1].
Hingegen ist Mehrfach-Schnittstellenvererbung unproblematisch. In Java, Delphi, C# und VB (.NET) kann eine Klasse beliebig viele Schnittstellen erben. Damit verpflichtet sich diese Klasse, die Methoden der Schnittstelle zur Verfügung zu stellen und stellt damit auch die ist-ein-Beziehung her.
Mit einfacher Klassenvererbung und mehrfacher Schnittstellenvererbung sind die meisten Anforderungen an ein Software-Design realisierbar, ohne die Nachteile der uneingeschränkten Mehrfachvererbung in Kauf nehmen zu müssen.
Ein Sonderfall der Vererbung ist die von der Webanwendung Zope realisierte Akquisition: Hierbei erbt ein Objekt nicht aufgrund seiner Klasse von seiner Superklasse (Ist-ein-Beziehung), sondern durch seine Position in einer Objekthierarchie (part-of oder ist enthalten in). Dies ist nützlich z. B. für die Generierung dynamischer Internet-Auftritte: oben im Objektbaum (d. h. nahe der Wurzel) definierte Eigenschaften oder Methoden werden an alle Objekte vererbt, die weiter unten in dem betreffenden Unterbaum liegen.
Auf das Beispiel eines Autos übertragen hieße dies etwa, dass das Auto die Eigenschaft Farbe und vier Radkappen hat; die Radkappen sind Teil des Autos (bzw. darin enthalten) und erben von ihrem Container, dem Auto, die Eigenschaft Farbe.