Begriff
Inheritance (Vererbung)
Warum wichtig?
Dieser Begriff ist ein Knoten im SengakujiWorks-Wissensnetz. Nutze Level 0 für die erste Einordnung, Level 1 für Praxis, Level 2 für technische Struktur und Level 3 für Grenzen, Fallstricke und Expertenkontext.
Programmierer sind faul.
Du hast eine Klasse Auto mit fahren(), bremsen(), tanken().
Jetzt willst du Sportwagen.
Willst du alles nochmal tippen? Nein.
Du sagst: "Sportwagen erbt von Auto".
Er bekommt geschenkt: Alle Methoden und Variablen von Auto.
Du musst nur noch turboZünden() neu dazu schreiben.
Code Wiederverwendung pur.
Merksatz: Ein Mechanismus in der objektorientierten Programmierung, bei dem eine neue Klasse (Kindklasse) die Eigenschaften und Methoden einer bestehenden Klasse (Elternklasse) übernimmt.
Java: class Sportwagen extends Auto
Python: class Sportwagen(Auto)
Zugriff auf Eltern: super().fahren(). (Ruft die Original-Methode auf).
1. Das Diamond Problem
C++ erlaubt Mehrfachvererbung (Erben von 2 Eltern).
Klasse AmphibienFahrzeug erbt von Auto und Boot.
Beide haben fahren().
Welches fahren() nutzt das Kind?
Das führt zu riesigen Konflikten.
Java/C# verbieten Mehrfachvererbung von Klassen. Erlauben aber Mehrfach-Implementierung von Interfaces (weil Interfaces keinen Code haben, der kollidieren kann).
2. Fragile Base Class Problem
Du änderst was in der Elternklasse Auto.
Plötzlich gehen alle 50 Kinderklassen kaputt (LKW, Bus, Sportwagen), weil sie sich auf ein Detail verlassen haben, das du geändert hast.
Vererbung erzeugt eine starke Kopplung.
Deshalb raten Experten heute oft zu "Composition over Inheritance".
3. Prototypal Inheritance (JavaScript)
JS hat keine "Klassen" (unter der Haube).
Es hat Prototypen.
Jedes Objekt hat einen Link zu einem Vater-Objekt.
Wenn du obj.x suchst und es nicht findest, sucht JS im Vater. Dann im Großvater. Bis null.
Das ist dynamischer als klassische Vererbung (man kann den Vater zur Laufzeit tauschen).
1. Virtual Method Dispatch (Vtables)
Wie weiß der Computer zur Laufzeit, welchen Code er ausführen muss?
Animal a = new Dog(); a.speak();
Der C++ / Java Compiler sieht den Typen Animal, aber er muss bellen, nicht schweigen.
Die technische Lösung ist die Vtable (Virtual Method Table).
Die Klasse Dog bekommt intern ein verstecktes Objekt (ein Array von Function-Pointers).
Rufst du a.speak() auf, schaut der Prozessor zuerst im Vtable-Pointer des Objekts a im RAM nach, wo die reelle C-Speicheradresse des Maschinencodes für speak() liegt und springt erst danach per JMP dorthin. Dieser Extra-Sprung in den Speicher (Dynamic Dispatch) kostet Taktzyklen, weshalb tiefe Vererbungshierarchien im Gaming-Bereich (C++) oft durch ECS (Entity Component Systems) vermieden werden.
2. Das Liskovsche Substitutionsprinzip (LSP)
Das "L" in den S.O.L.I.D. Prinzipien.
Es besagt: Eine Kindklasse muss ihre Elternklasse ersetzen können, ohne dass das Programm abstürzt oder unerwartete Dinge tut.
Klassisches Negativ-Beispiel: Pinguin erbt von Vogel.
Vogel hat eine Methode fliegen().
Der Programmierer deklariert in Pinguin bei fliegen() eine Exception("Ich kann nicht fliegen").
Das bricht das Prinzip radikal! Wenn eine iterierende Schleife foreach(Vogel v in vögel) alle Vögel fliegen lässt, stürzt das Programm beim Pinguin ab. Vererbung (Is-a Beziehung) war hier architektonisch falsch modelliert.
3. Composition over Inheritance (CoI)
Vererbung zur Codesharing ist ein oft verurteiltes Anti-Pattern (Fragile Base Class).
Die moderne Ansicht: Klassen vererben Verhalten nur strukturell (über Interfaces), aber sie erben keinen Zustand / Implementation.
Anstatt dass GepanzertesAuto von Auto erbt und dann die Rüstungscodes ins Auto-Skript frickelt, nutzt man Komposition (Has-a Beziehung):
Auto hat ein Interface IRüstung. Man injiziert die Rüstung zur Laufzeit ins Auto (new Auto(new PanzerRüstung())). Das ist hochgradig modular, testbar und zerschießt nicht die Vererbungslinien der Karosserie-Klasse.
Quick-Check
finalKlasse?In Java/C# kann man sagen: "Niemand darf von mir erben". (final class/sealed class). Wichtig für Security und Performance (Compiler kann optimieren).Abstract Class?
Eine Elternklasse, die man nicht "bauen" kann (new Tier()geht nicht). Man muss erst eine konkrete Unterklasse (Hund) bauen. Dient nur als Vorlage.Mixin?
Ein Trick, um Mehrfachvererbung zu simulieren (z. B. in Python oder Ruby). Eine kleine Klasse ("KannFliegen"), die man in andere Klassen reinkopiert.