Menu
Coddy logo textTech

Elternmethoden aufrufen

Teil des Abschnitts Objektorientierte Programmierung der Lua-Journey von Coddy. Lektion 38 von 70.

Manchmal ist es nicht das, was du möchtest, eine Methode vollständig zu überschreiben. Stattdessen möchtest du vielleicht das Verhalten der übergeordneten Klasse erweitern: das tun, was die übergeordnete Klasse tut, und anschließend etwas Zusätzliches hinzufügen. Dazu kannst du die Methode der übergeordneten Klasse direkt innerhalb der Überschreibung der Methode in der untergeordneten Klasse aufrufen.

Die Technik verwendet die Punkt-Syntax mit dem Namen der Elternklasse, wobei self explizit als erstes Argument übergeben wird:

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 Elternmethode aufrufen
    print(self.name .. " wags tail happily")
end

Die entscheidende Zeile ist Animal.speak(self). Indem wir die Punktsyntax für die übergeordnete Klasse 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 Schwanz

Dieses Muster ist nützlich, wenn die übergeordnete Methode wichtige Aufgaben ausführt, die du nicht duplizieren möchtest. Die untergeordnete Methode kann die Logik der übergeordneten Methode zuerst, zuletzt oder sogar in der Mitte ihres eigenen Codes ausführen, sodass du die volle Kontrolle darüber hast, wie sich die Verhaltensweisen kombinieren.

challenge icon

Aufgabe

Einfach

Erstellen wir ein Begrüßungssystem, in dem ein FormalPerson das Verhalten einer regulären Person erweitert! Anstatt vollständig zu ersetzen, wie eine Person sich vorstellt, wird die formelle Version zuerst die standardmäßige Vorstellung ausführen und anschließend eine zusätzliche höfliche Geste hinzufügen.

Du wirst deinen Code auf drei Dateien verteilen:

  • Person.lua: Deine Basisklasse mit einem :new(name)-Konstruktor, der den Namen der Person speichert. Füge eine :introduce()-Methode ein, die den Namen der Person gefolgt von says hi ausgibt. Dies ist das Basisverhalten, das erweitert werden soll.
  • FormalPerson.lua: Eine Kindklasse, die von Person erbt. Ihr Konstruktor sollte den Konstruktor der übergeordneten Klasse aufrufen, um den Namen zu verarbeiten. Überschreibe die :introduce()-Methode, aber ersetze das Verhalten der übergeordneten Klasse nicht vollständig. Rufe stattdessen zuerst die Methode der übergeordneten Klasse mit Person.introduce(self) auf und gib anschließend eine zusätzliche Zeile mit dem Namen der Person gefolgt von bows politely aus.
  • main.lua: Fordere dein FormalPerson-Modul an, lies einen Namen von der Eingabe ein, erstelle eine FormalPerson-Instanz und rufe :introduce() auf, um beide kombinierten Verhaltensweisen zu sehen.

Du erhältst eine Eingabe: den Namen der Person.

Wenn du :introduce() für eine FormalPerson aufrufst, sollte dies zwei Ausgabezeilen erzeugen: die erste aus der Methode der übergeordneten Klasse, die zweite aus der Ergänzung der Kindklasse:

{name} says hi
{name} bows politely

Wenn die Eingabe beispielsweise Eleanor lautet, sollte die Ausgabe folgendermaßen aussehen:

Eleanor says hi
Eleanor bows politely

Die wichtigste Erkenntnis ist, dass FormalPerson die Logik für „says hi“ nicht dupliziert. Stattdessen überträgt die Klasse diese Aufgabe an die Methode der übergeordneten Klasse und fügt anschließend ihr eigenes einzigartiges Verhalten hinzu. Dadurch bleibt dein Code übersichtlich und zeigt, wie Kindklassen die Funktionalität übergeordneter Klassen erweitern können, anstatt sie zu ersetzen!

Probier es selbst

-- main.lua: Einstiegspunkt für das Begrüßungssystem

local FormalPerson = require('FormalPerson')

-- Lies den Namen der Person von der Eingabe
local name = io.read()

-- TODO: Erstelle eine FormalPerson-Instanz mit dem gegebenen Namen

-- TODO: Rufe die introduce-Methode auf der FormalPerson-Instanz auf
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Lua-Compiler