Elternmethoden aufrufen
Teil des Abschnitts Object Oriented Programming der Lua-Journey von Coddy — Lektion 38 von 70.
Manchmal ist das vollständige Überschreiben einer Methode nicht das, was Sie möchten. Stattdessen möchten Sie vielleicht das Verhalten der Elternklasse erweitern – das tun, was die Elternklasse tut, und dann etwas Zusätzliches hinzufügen. Um dies zu erreichen, können Sie die Methode der Elternklasse direkt aus der Überschreibung der Kindklasse heraus aufrufen.
Die Technik verwendet die Punkt-Syntax mit dem Namen der Elternklasse und übergibt self explizit als erstes Argument:
local Animal = {}
Animal.__index = Animal
function Animal:new(name)
local obj = {name = name}
setmetatable(obj, Animal)
return obj
end
function Animal:speak()
print(self.name .. " makes a sound")
end
-- Dog erweitert das Verhalten der Elternklasse
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})
function Dog:new(name)
local obj = Animal.new(Animal, name)
setmetatable(obj, Dog)
return obj
end
function Dog:speak()
Animal.speak(self) -- Zuerst die Methode der Elternklasse aufrufen
print(self.name .. " wags tail happily")
endDie entscheidende Zeile ist Animal.speak(self). Indem wir die Punkt-Syntax auf der Elternklasse verwenden und self manuell übergeben, rufen wir die ursprüngliche Methode auf, bevor wir unser eigenes Verhalten hinzufügen:
local buddy = Dog:new("Buddy")
buddy:speak()
-- Ausgabe:
-- Buddy macht ein Geräusch
-- Buddy wedelt glücklich mit dem SchwanzDieses Muster ist nützlich, wenn die Elternmethode wichtige Arbeit leistet, die Sie nicht duplizieren möchten. Das Kind kann die Logik der Elternmethode zuerst, zuletzt oder sogar in der Mitte des eigenen Codes ausführen – was Ihnen die volle Kontrolle darüber gibt, wie Verhaltensweisen kombiniert werden.
Aufgabe
EinfachLassen Sie uns ein Begrüßungssystem bauen, bei dem eine FormalPerson das Verhalten einer regulären Person erweitert! Anstatt die Art und Weise, wie sich eine Person vorstellt, komplett zu ersetzen, wird die formelle Version zuerst die Standardvorstellung durchführen und dann eine zusätzliche höfliche Geste hinzufügen.
Sie werden Ihren Code über drei Dateien organisieren:
Person.lua: Ihre Basisklasse mit einem:new(name)-Konstruktor, der den Namen der Person speichert. Fügen Sie eine:introduce()-Methode hinzu, die den Namen der Person gefolgt vonsays hiausgibt. Dies ist das Basisverhalten, das erweitert wird.FormalPerson.lua: Eine Kindklasse, die von Person erbt. Ihr Konstruktor sollte den Eltern-Konstruktor aufrufen, um den Namen zu verarbeiten. Überschreiben Sie die:introduce()-Methode, aber anstatt das Verhalten der Elternklasse vollständig zu ersetzen, rufen Sie zuerst die Methode der Elternklasse auf, indem SiePerson.introduce(self)verwenden, und geben Sie dann eine zusätzliche Zeile mit dem Namen der Person gefolgt vonbows politelyaus.main.lua: Binden Sie Ihr FormalPerson-Modul ein, lesen Sie einen Namen aus der Eingabe ein, erstellen Sie eine FormalPerson-Instanz und rufen Sie:introduce()auf, um beide Verhaltensweisen kombiniert zu sehen.
Sie erhalten eine Eingabe: den Namen der Person.
Wenn Sie :introduce() für eine FormalPerson aufrufen, sollten zwei Zeilen ausgegeben werden – die erste von der Methode der Elternklasse, die zweite von der Ergänzung der Kindklasse:
{name} says hi
{name} bows politelyWenn die Eingabe beispielsweise Eleanor ist, sollte die Ausgabe wie folgt aussehen:
Eleanor says hi
Eleanor bows politelyDie entscheidende Erkenntnis hierbei ist, dass FormalPerson die "says hi"-Logik nicht dupliziert – sie delegiert diese Arbeit an die Elternmethode und fügt dann ihr eigenes, einzigartiges Verhalten hinzu. Dies hält Ihren Code sauber und zeigt, wie Kindklassen die Funktionalität der Eltern erweitern können, anstatt sie zu ersetzen!
Spickzettel
Um das Verhalten einer Elternmethode zu erweitern, anstatt es vollständig zu überschreiben, rufen Sie die Elternmethode innerhalb des Overrides des Kindes unter Verwendung der Punkt-Syntax auf und übergeben Sie explizit self:
function ChildClass:method()
ParentClass.method(self) -- Elternmethode aufrufen
-- Zusätzliches Verhalten hinzufügen
endVollständiges Beispiel, das die Methodenerweiterung zeigt:
local Animal = {}
Animal.__index = Animal
function Animal:new(name)
local obj = {name = name}
setmetatable(obj, Animal)
return obj
end
function Animal:speak()
print(self.name .. " makes a sound")
end
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})
function Dog:new(name)
local obj = Animal.new(Animal, name)
setmetatable(obj, Dog)
return obj
end
function Dog:speak()
Animal.speak(self) -- Zuerst das Elternverhalten ausführen
print(self.name .. " wags tail happily") -- Kindverhalten hinzufügen
end
local buddy = Dog:new("Buddy")
buddy:speak()
-- Output:
-- Buddy makes a sound
-- Buddy wags tail happilyDie Elternmethode kann zu jedem Zeitpunkt aufgerufen werden: davor, danach oder mitten in der eigenen Logik des Kindes, was die volle Kontrolle darüber gibt, wie Verhaltensweisen kombiniert werden.
Probier es selbst
-- main.lua: Einstiegspunkt für das Begrüßungssystem
local FormalPerson = require('FormalPerson')
-- Den Namen der Person aus der Eingabe lesen
local name = io.read()
-- TODO: Eine FormalPerson-Instanz mit dem angegebenen Namen erstellen
-- TODO: Die Methode introduce der FormalPerson-Instanz aufrufen
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Object Oriented Programming
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-Klasse2Klassen-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