Methoden vererben
Teil des Abschnitts Objektorientierte Programmierung der Lua-Journey von Coddy. Lektion 32 von 70.
Nachdem die Vererbungsverknüpfung hergestellt wurde, erhalten Instanzen der Kindklasse automatisch Zugriff auf alle Methoden der Elternklasse. Dies geschieht über Luas Suchkette: Wenn du eine Methode für eine Instanz aufrufst, durchsucht Lua jede verbundene Tabelle, bis es das Gesuchte findet.
Betrachte diese Einrichtung, bei der Animal eine :breathe()-Methode definiert:
local Animal = {}
Animal.__index = Animal
function Animal:new()
local obj = {}
setmetatable(obj, Animal)
return obj
end
function Animal:breathe()
print("Breathing...")
end
-- Dog erbt von Animal
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})
function Dog:new()
local obj = {}
setmetatable(obj, Dog)
return obj
endSchau dir nun an, was passiert, wenn wir einen Dog erstellen und die Methode der übergeordneten Klasse aufrufen:
local buddy = Dog:new()
buddy:breathe() -- Ausgabe: Atmen...Die Klasse Dog hat :breathe() nie definiert, trotzdem funktioniert es. Lua prüft zuerst buddy und findet nichts, prüft dann Dog, ebenfalls ohne Ergebnis, und findet es schließlich in Animal. Diese automatische Methodenvererbung bedeutet, dass du gemeinsames Verhalten einmal in der übergeordneten Klasse schreibst und jede untergeordnete Klasse sofort davon profitiert.
Aufgabe
EinfachErstellen wir eine einfache Kreatur-Hierarchie, um die Vererbung von Methoden in Aktion zu sehen! Du erstellst eine übergeordnete Klasse Animal und eine untergeordnete Klasse Dog und zeigst anschließend, dass Dog-Instanzen Methoden verwenden können, die nur in Animal definiert sind.
Du organisierst deinen Code auf drei Dateien verteilt:
Animal.lua: Definiere deine übergeordnete Klasse mit dem standardmäßigen Klassenmuster. Füge einen:new(name)-Konstruktor ein, der den Namen des Tiers speichert, sowie eine:speak()-Methode, die den Namen des Tiers gefolgt vonmakes a soundausgibt. Gib die Klasse am Ende der Datei zurück.Dog.lua: Definiere deine untergeordnete Klasse, die von Animal erbt. Binde das Animal-Modul ein und richte die Vererbungsverknüpfung ein, damit Dog auf die Methoden von Animal zugreifen kann. Füge einen:new(name)-Konstruktor ein, der den Namen speichert und Dog als Metatable festlegt. Die Dog-Klasse darf KEINE eigene:speak()-Methode definieren. Sie erbt diese von Animal.main.lua: Binde dein Dog-Modul ein, lies einen Namen aus der Eingabe, erstelle eine Dog-Instanz mit diesem Namen und rufe die:speak()-Methode darauf auf.
Du erhältst eine Eingabe: den Namen des Hundes.
Wenn die Eingabe beispielsweise Buddy lautet, sollte die Ausgabe wie folgt aussehen:
Buddy makes a soundDas Magische daran ist, dass deine Dog-Klasse niemals :speak() definiert und der Aufruf auf einer Dog-Instanz trotzdem einwandfrei funktioniert. Lua folgt der Suchkette von der Dog-Instanz zur Dog-Klasse und anschließend zur Animal-Klasse, wo die Methode gefunden wird. Das ist Vererbung in Aktion!
Probier es selbst
-- main.lua: Einstiegspunkt
local Dog = require('Dog')
-- Lies den Namen des Hundes von der Eingabe
local name = io.read()
-- TODO: Erstelle eine Dog-Instanz mit dem gegebenen Namen
-- TODO: Rufe die :speak()-Methode auf der Dog-Instanz auf
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