Das Vererbungs-Setup
Teil des Abschnitts Objektorientierte Programmierung der Lua-Journey von Coddy. Lektion 31 von 70.
Bisher hast du Klassen erstellt, bei denen jedes Objekt Methoden in einer einzigen Prototypentabelle nachschlägt. Aber was ist, wenn du möchtest, dass eine Klasse auf einer anderen aufbaut? Hier kommt die Vererbung ins Spiel: Eine untergeordnete Klasse kann auf alles aus einer übergeordneten Klasse zugreifen und gleichzeitig ihre eigenen Funktionen hinzufügen.
Die entscheidende Erkenntnis ist, dass eine Klassentabelle selbst eine Metatabelle haben kann. Wenn Lua etwas in der untergeordneten Klasse nicht finden kann, sucht es im __index der Metatabelle der untergeordneten Klasse, der auf die übergeordnete Klasse verweist.
-- Elternklasse
local Animal = {}
Animal.__index = Animal
function Animal:new()
local obj = {}
setmetatable(obj, Animal)
return obj
end
function Animal:breathe()
print("Breathing...")
endHier ist nun die Einrichtung der Vererbung. Wir erstellen eine Kindklasse und setzen ihre Metatabelle so, dass sie auf die Elternklasse verweist:
-- Kindklasse
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})Diese einzelne Zeile, setmetatable(Dog, {__index = Animal}), erstellt die Vererbungsverknüpfung. Wenn eine Dog-Instanz eine in Dog nicht gefundene Methode aufruft, überprüft Lua Animal.
Die Nachschlagenkette funktioniert folgendermaßen: instance → Dog → Animal. Jeder Schritt verwendet __index, um die nächste zu durchsuchende Tabelle zu finden. Dadurch können untergeordnete Klassen automatisch alle Methoden der übergeordneten Klassen erben, ohne sie zu kopieren.
Aufgabe
EinfachErstellen wir deine erste Vererbungshierarchie! Du wirst eine einfache Eltern-Kind-Klassenbeziehung erstellen, bei der die Klasse Machine als Basisklasse dient und die Klasse Robot von ihr erbt.
Du wirst deinen Code auf drei Dateien verteilen:
Machine.lua: Definiere deine Elternklasse mit dem standardmäßigen Klassenmuster. Füge einen:new()-Konstruktor und eine:status()-Methode hinzu, dieMachine is operationalausgibt. Vergiss nicht,__indexeinzurichten und die Klasse am Ende der Datei zurückzugeben.Robot.lua: Definiere deine Kindklasse, die von Machine erbt. Fordere das Machine-Modul an, richte die Robot-Tabelle mit ihrem eigenen__indexein und stelle die Vererbungsverbindung mitsetmetatable(Robot, {__index = Machine})her. Füge einen:new()-Konstruktor hinzu, der eine Instanz mit Robot als Metatabelle erstellt.main.lua: Führe alles zusammen, indem du dein Robot-Modul anforderst, eine Robot-Instanz erstellst und die geerbte:status()-Methode aufrufst.
Das zentrale Konzept hierbei ist, dass deine Robot-Klasse :status() nicht selbst definiert. Sie erbt diese Methode von Machine über die Metatabellenkette. Wenn du :status() für eine Robot-Instanz aufrufst, sucht Lua zuerst in Robot, findet die Methode dort nicht und folgt dann der __index-Verbindung zu Machine, wo die Methode gefunden wird.
Deine Ausgabe sollte folgendermaßen aussehen:
Machine is operationalDiese eine Zeile beweist, dass die Vererbung funktioniert. Deine Robot-Klasse hat erfolgreich auf eine Methode zugegriffen, die nur in ihrer Elternklasse definiert ist!
Probier es selbst
-- main.lua: Alles zusammenbringen
-- TODO: Das Robot-Modul einbinden
-- TODO: Erstelle eine Robot-Instanz mit Robot:new()
-- TODO: Rufe die geerbte :status()-Methode auf deiner Robot-Instanz auf
-- This should print "Machine is operational"
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Das 'self'-Konzept
Tabellen mit FunktionenExplizites 'self'Die Doppelpunkt-SyntaxPunkt vs. DoppelpunktZusammenfassung – Beweglicher Punkt4Projekt: Digitale Bank
Projekt-SetupEinzahlungsmethode7Polymorphie & Überschreiben
Methoden überschreibenElternmethoden aufrufenDuck TypingGemeinsames InterfaceTyp prüfenRückblick - Mitarbeiterrollen10Projekt: Formen-Manager
Projekt-SetupRechteck-KlasseKreis-KlasseUmfang-MethodeFormen-SammlungGesamtflächeFormen filtern2Klassen-Prototyp-Muster
Das Prototyp-KonzeptVerknüpfung mit __indexDer :new()-KonstruktorAttribute initialisierenUnabhängige InstanzenZusammenfassung – Autofabrik5Operatorüberladung in OOP
Objekte addierenObjekte subtrahierenObjekte verkettenObjekte vergleichen (<, >)Rückblick – Wallet-Mathematik3Objektzustand und -verhalten
InstanzvariablenGetter-MethodenSetter-MethodenBerechnete EigenschaftenStrings formatierenGleichheitsprüfungenZusammenfassung – Studentennote6Grundlagen der Vererbung
Das Vererbungs-SetupMethoden vererbenDen Konstruktor erweiternChild-Methoden hinzufügenGemeinsam vs. EinzigartigZusammenfassung - Formen-Hierarchie9Komposition & Mixins
Has-A-BeziehungDelegationEinfache MixinsAnwendung mehrerer MixinsMixins vs. VererbungZusammenfassung – Roboter-Montage12Abschluss-Herausforderungen
Wiederholung - InventarsystemWiederholung - BenutzerverwaltungWiederholung - Score-TrackerFinaler OOP-CheckÜbe selbstständig: Online-Lua-Compiler