Elternmethoden aufrufen
Teil des Abschnitts Objektorientierte Programmierung 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!
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 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