Menu
Coddy logo textTech

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!")
end

Schauen 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.

challenge icon

Aufgabe

Einfach

Lass 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 deine Cat-Klasse mit dem vollständigen Konstruktor-Muster. Deine Klasse sollte Folgendes enthalten:
    • Die Klassentabelle, wobei __index auf 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
    Gib die Klassentabelle am Ende der Datei zurück.
  • 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
end

Das __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
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 Object Oriented Programming