Vererbung
Vererbung (englisch: Inheritance) ist eines der vier Grundprinzipien der objektorientierten Programmierung (OOP). Sie ermoeglicht es, neue Klassen auf Basis bereits existierender Klassen zu erstellen. Die abgeleitete Klasse (Kindklasse) uebernimmt dabei automatisch alle Eigenschaften und Methoden der Basisklasse (Elternklasse) und kann diese erweitern oder anpassen.
Grundkonzept der Vererbung
| Vererbungstyp | Beschreibung | Unterstuetzt 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 koennen mehrere Interfaces implementieren | Java, C#, TypeScript |
Java und C# erlauben keine direkte Mehrfachvererbung von Klassen, da dies zu Konflikten fuehren kann (das sogenannte Diamond-Problem). Stattdessen koennen Klassen mehrere Interfaces implementieren, um aehnliche Flexibilitaet 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 aussen |
|---|---|---|
public |
Ja | Ja |
protected |
Ja | Nein |
private |
Nein | Nein |
Der Modifikator protected ist besonders bei Vererbung nuetzlich: Attribute sind fuer Kindklassen zugaenglich, aber von ausserhalb der Klassenhierarchie nicht sichtbar.
Vererbung und die anderen OOP-Prinzipien
Vererbung ist eng mit den anderen Grundprinzipien der OOP verknuepft:
- Kapselung: Basisklassen kapseln gemeinsame Funktionalitaet und schuetzen interne Daten durch Zugriffsmodifikatoren.
- Polymorphie: Durch Ueberschreiben von Methoden koennen abgeleitete Klassen unterschiedliche Verhaltensweisen zeigen, obwohl sie den gleichen Typ haben.
- Abstraktion: Abstrakte Klassen definieren Schnittstellen, die von Kindklassen implementiert werden muessen.
Best Practices
Bei der Verwendung von Vererbung solltest du einige Grundsaetze beachten:
- "Ist-ein"-Beziehung pruefen: 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 waere Komposition besser.
- Vererbungshierarchie flach halten: Tiefe Hierarchien mit vielen Ebenen werden schnell unuebersichtlich und schwer wartbar.
- Komposition vor Vererbung: Oft ist es flexibler, Objekte zu kombinieren, anstatt von ihnen zu erben.
- Liskovsches Substitutionsprinzip: Objekte einer Kindklasse muessen ueberall 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 fuer Entity-Klassen
Wer als Fachinformatiker fuer Anwendungsentwicklung arbeitet, wird Vererbung regelmaessig einsetzen - sei es bei der Entwicklung eigener Klassenhierarchien oder bei der Arbeit mit bestehenden Frameworks.
Quellen und weiterfuehrende Links
- Oracle Java Tutorial: Inheritance
- Microsoft Learn: Vererbung in C#
- Python Documentation: Classes
- Wikipedia: Vererbung (Programmierung)
Ueberschreiben von Methoden
Eine wichtige Eigenschaft der Vererbung ist das Ueberschreiben (Override) von Methoden. Eine Kindklasse kann eine geerbte Methode neu implementieren, um ein anderes Verhalten zu definieren. Dies ist die Grundlage fuer Polymorphie.
public class Tier {
public void lautGeben() {
System.out.println("Das Tier macht ein Geraeusch.");
}
}
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 Ueberschreiben verhalten sich Katze und Hund unterschiedlich, obwohl beide von Tier erben. Die Annotation @Override in Java signalisiert dem Compiler, dass eine Methode ueberschrieben 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 hinzufuegen.
Einfache vs. Mehrfachvererbung
Je nach Programmiersprache gibt es unterschiedliche Vererbungsmodelle: