Der :new()-Konstruktor
Teil des Abschnitts Object Oriented Programming der Lua-Journey von Coddy — Lektion 8 von 70.
Das manuelle Erstellen von Objekten – das Erstellen einer leeren Tabelle, das Setzen ihrer Metatable, das Verknüpfen von __index – wird repetitiv. Die Standardlösung besteht darin, eine :new()-Konstruktormethode direkt in der Klasse zu definieren, die all dies für Sie übernimmt.
Hier ist das Muster:
local Dog = {}
Dog.__index = Dog
function Dog:new()
local instance = {}
setmetatable(instance, self)
return instance
end
function Dog:bark()
print("Woof!")
endSchauen wir uns an, was innerhalb von :new() passiert. Zuerst erstellen wir eine leere Tabelle namens instance. Dann setzen wir ihre Metatabelle auf self – was Dog ist, wenn wir Dog:new() aufrufen.
Da Dog.__index auf Dog selbst zeigt, kann die Instanz alle in Dog definierten Methoden finden. Schließlich geben wir das neue Objekt zurück.
Beachten Sie die Zeile Dog.__index = Dog außerhalb des Konstruktors. Dies ist eine gängige Abkürzung – anstatt eine separate Metatabelle zu erstellen, dient die Klassentabelle sowohl als Prototyp als auch als Metatabelle.
Das Erstellen von Objekten ist nun sauber und konsistent:
local myDog = Dog:new()
myDog:bark() -- Ausgabe: Woof!Jede Klasse, die Sie erstellen, wird derselben Struktur folgen. Der :new()-Konstruktor wird zum einzigen Ort, an dem die Objekterstellung stattfindet, was Ihren Code organisiert und vorhersehbar macht.
Aufgabe
EinfachLass uns eine Cat-Klasse erstellen, indem wir das Standard-Konstruktor-Muster verwenden, das du gerade gelernt hast. Du wirst deinen Code über zwei Dateien organisieren, um die richtige Modulstruktur zu üben.
Du wirst Folgendes erstellen:
Cat.lua: Definiere deineCat-Klasse mit dem vollständigen Konstruktor-Muster. Deine Klasse sollte Folgendes enthalten:- Die Klassentabelle, wobei
__indexauf sich selbst zeigt - Einen
:new()-Konstruktor, der eine Instanz erstellt, deren Metatabelle setzt und sie zurückgibt - Eine
:meow()-Methode, die das Geräusch der Katze ausgibt
- Die Klassentabelle, wobei
main.lua: Binde dein Cat-Modul mit require ein und verwende den Konstruktor, um eine Katzeninstanz zu erstellen. Rufe dann deren Methode auf, um zu überprüfen, ob alles korrekt verknüpft ist.
Du erhältst eine Eingabe: die Anzahl der Male, die deine Katze miauen soll.
Deine :meow()-Methode sollte genau Folgendes ausgeben:
Meow!Erstelle in deiner Hauptdatei eine Katze mit Cat:new() und rufe :meow() so oft auf, wie angegeben.
Wenn die Eingabe zum Beispiel 3 ist, sollte die Ausgabe wie folgt aussehen:
Meow!
Meow!
Meow!Spickzettel
Um eine Klasse mit einem Konstruktor in Lua zu erstellen, definieren Sie eine :new()-Methode, die Instanzen erstellt:
local ClassName = {}
ClassName.__index = ClassName
function ClassName:new()
local instance = {}
setmetatable(instance, self)
return instance
end
function ClassName:method()
-- Methodenimplementierung
endDas __index-Feld verweist auf die Klasse selbst, wodurch Instanzen auf Methoden zugreifen können, die in der Klassentabelle definiert sind.
Innerhalb von :new():
- Erstellen Sie eine leere Tabelle für die Instanz
- Setzen Sie deren Metatabelle auf
self(die Klasse) - Geben Sie die neue Instanz zurück
Erstellen Sie Objekte mit dem Konstruktor:
local obj = ClassName:new()
obj:method()Probier es selbst
-- Das Cat-Modul einbinden
local Cat = require('Cat')
-- Eingabe lesen: Anzahl der Miau-Vorgänge
local times = tonumber(io.read())
-- TODO: Erstelle eine Cat-Instanz mit Cat:new()
-- TODO: Rufe die Methode :meow() so oft wie angegeben auf
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