Vererbung (Programmierung)
aus Wikipedia, der freien Enzyklopädie
In der Objektorientierung ist Vererbung eine Methode, neue Klassen unter Verwendung von bestehenden aufzubauen. Zu unterscheiden ist dabei Schnittstellenvererbung und Klassenvererbung. Bei der Schnittstellenvererbung „erbt“ eine abgeleitete Klasse die Signaturen von Methoden, muss die Methoden aber selbst implementieren. Bei der Klassenvererbung erbt die abgeleitete Klasse auch die Implementierung von einer oder mehreren Basisklassen.
Inhaltsverzeichnis |
[Bearbeiten] Prinzip
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.
[Bearbeiten] Vererbung und das Klassenkonzept
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.
[Bearbeiten] Beispiel
Ein Fahrzeug besitzt bestimmte Attribute, diese können z.B. Höchstgeschwindigkeit oder 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.
- Ein Personenkraftwagen ist ein Kraftfahrzeug,
- Ein Personenkraftwagen ist ein Fahrzeug, aber
- Ein Fahrzeug ist kein Personenkraftwagen.
- Ein Personenkraftwagen ist auch kein Sitz
- Ein Personenkraftwagen enthält einen Sitz.
Hat ein bezeichnet also Attribute einer Klasse.
[Bearbeiten] Mehrfachvererbung
Von Mehrfachvererbung 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, z.B. C++, Eiffel und Python. Dagegen wird sie von Smalltalk und Ada nicht unterstützt. Als Einwand gegen Mehrfach-Klassenvererbung wird häufig genannt, dass sie das Design unnötig kompliziert und undurchsichtig machen könne. So kann es dadurch zu Mehrdeutigkeiten im Rahmen des Diamond-Problems kommen.
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.
[Bearbeiten] Akquisition
Ein Sonderfall der Vererbung ist die von der Webanwendung Zope realisierte Akquisition: Hierbei erbt ein Objekt nicht aufgrund seiner Klasse von seiner Superklasse (is-a- bzw. 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, könnte man sich vorstellen, 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.