Vererbung
Vererbung (englisch: Inheritance) ist eines der vier Grundprinzipien der objektorientierten Programmierung (OOP). Sie ermöglicht es, neue Klassen auf Basis bereits existierender Klassen zu erstellen. Die abgeleitete Klasse (Kindklasse) übernimmt dabei automatisch alle Eigenschaften und Methoden der Basisklasse (Elternklasse) und kann diese erweitern oder anpassen.
Grundkonzept der Vererbung
| Vererbungstyp | Beschreibung | Unterstützt von |
|---|---|---|
| Einfache Vererbung | Eine Klasse erbt von genau einer Basisklasse | Java, C#, PHP |
| Mehrfachvererbung | Eine Klasse kann von mehreren Basisklassen erben | C++, Python |
| Interface-Vererbung | Klassen können mehrere Interfaces implementieren | Java, C#, TypeScript |
Java und C# erlauben keine direkte Mehrfachvererbung von Klassen, da dies zu Konflikten führen kann (das sogenannte Diamond-Problem). Stattdessen können Klassen mehrere Interfaces implementieren, um ähnliche Flexibilität zu erreichen.
Zugriffsmodifikatoren und Vererbung
Die Sichtbarkeit von Attributen und Methoden beeinflusst, was eine Kindklasse erben und nutzen kann:
| Modifikator | Zugriff in Kindklasse | Zugriff von außen |
|---|---|---|
public |
Ja | Ja |
protected |
Ja | Nein |
private |
Nein | Nein |
Der Modifikator protected ist besonders bei Vererbung nützlich: Attribute sind für Kindklassen zugänglich, aber von außerhalb der Klassenhierarchie nicht sichtbar.
Vererbung und die anderen OOP-Prinzipien
Vererbung ist eng mit den anderen Grundprinzipien der OOP verknüpft:
- Kapselung: Basisklassen kapseln gemeinsame Funktionalität und schützen interne Daten durch Zugriffsmodifikatoren.
- Polymorphie: Durch Überschreiben von Methoden können abgeleitete Klassen unterschiedliche Verhaltensweisen zeigen, obwohl sie den gleichen Typ haben.
- Abstraktion: Abstrakte Klassen definieren Schnittstellen, die von Kindklassen implementiert werden müssen.
Best Practices
Bei der Verwendung von Vererbung solltest du einige Grundsätze beachten:
- "Ist-ein"-Beziehung prüfen: Vererbung sollte nur verwendet werden, wenn eine echte "ist-ein"-Beziehung besteht. Ein Hund "ist ein" Tier - das passt. Ein Auto "hat ein" Motor - hier wäre Komposition besser.
- Vererbungshierarchie flach halten: Tiefe Hierarchien mit vielen Ebenen werden schnell unübersichtlich und schwer wartbar.
- Komposition vor Vererbung: Oft ist es flexibler, Objekte zu kombinieren, anstatt von ihnen zu erben.
- Liskovsches Substitutionsprinzip: Objekte einer Kindklasse müssen überall einsetzbar sein, wo Objekte der Elternklasse erwartet werden.
Vererbung in der Praxis
Vererbung ist ein zentrales Konzept, das dir in vielen Bereichen der Softwareentwicklung begegnet:
- GUI-Frameworks: Buttons, Textfelder und Labels erben von einer gemeinsamen Basis-Widget-Klasse
- Spieleentwicklung: Verschiedene Spielfiguren erben von einer Character-Basisklasse
- Web-Frameworks: Controller und Services erben oft von abstrakten Basisklassen
- Datenbankzugriff: ORM-Frameworks nutzen Vererbung für Entity-Klassen
Wer als Fachinformatiker für Anwendungsentwicklung arbeitet, wird Vererbung regelmäßig einsetzen - sei es bei der Entwicklung eigener Klassenhierarchien oder bei der Arbeit mit bestehenden Frameworks.
Quellen und weiterführende Links
- Oracle Java Tutorial: Inheritance
- Microsoft Learn: Vererbung in C#
- Python Documentation: Classes
- Wikipedia: Vererbung (Programmierung)
Überschreiben von Methoden
Eine wichtige Eigenschaft der Vererbung ist das Überschreiben (Override) von Methoden. Eine Kindklasse kann eine geerbte Methode neu implementieren, um ein anderes Verhalten zu definieren. Dies ist die Grundlage für Polymorphie.
public class Tier {
public void lautGeben() {
System.out.println("Das Tier macht ein Geräusch.");
}
}
public class Katze extends Tier {
@Override
public void lautGeben() {
System.out.println("Miau!");
}
}
public class Hund extends Tier {
@Override
public void lautGeben() {
System.out.println("Wuff!");
}
}
Durch das Überschreiben verhalten sich Katze und Hund unterschiedlich, obwohl beide von Tier erben. Die Annotation @Override in Java signalisiert dem Compiler, dass eine Methode überschrieben wird.
Generalisierung und Spezialisierung
Bei der Vererbung unterscheidet man zwei Denkrichtungen:
Generalisierung (Bottom-Up)
Bei der Generalisierung analysiert man bestehende Klassen und extrahiert gemeinsame Eigenschaften in eine neue Oberklasse. Wenn du beispielsweise die Klassen Hund, Katze und Vogel hast, erkennst du gemeinsame Attribute wie name, alter und Methoden wie fressen(). Diese fasst du in einer Oberklasse Tier zusammen.
Spezialisierung (Top-Down)
Bei der Spezialisierung startest du mit einer allgemeinen Klasse und leitest speziellere Varianten ab. Aus der Klasse Fahrzeug entstehen die spezialisierten Klassen Auto, Motorrad und LKW, die jeweils eigene Attribute und Methoden hinzufügen.
Einfache vs. Mehrfachvererbung
Je nach Programmiersprache gibt es unterschiedliche Vererbungsmodelle: