Entwurf von Basisklassen und Konstruktoren
Entwerfen Sie eine Class()-Factory, die Metatabellen und new()-Konstruktoren einrichtet
Entwurf von Basisklassen und Konstruktoren ist eine kostenlose Lua Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Lua Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.
Ziel: Eine wiederverwendbare Klassenfabrik
Wir möchten eine Funktion Class(), die ein neues Klassenobjekt mit einem geeigneten Konstruktor, Methodenauflösung und OOP-Semantik zurückgibt.
Grundgerüst der Klassenfabrik
Die Fabrik erstellt eine Klassentabelle mit einer Metatable für die Methodenauflösung.
local function Class()
local cls = {}
cls.__index = cls
cls.__name = "AnonymousClass"
function cls:new(...)
local instance = setmetatable({}, cls)
if instance.init then instance:init(...) end
return instance
end
return cls
endEine Klasse definieren
Erstellen Sie eine Klasse, definieren Sie init (den Konstruktor) und fügen Sie Methoden hinzu.
local Animal = Class()
Animal.__name = "Animal"
function Animal:init(name, sound)
self.name = name
self.sound = sound
end
function Animal:speak()
print(self.name .. " says " .. self.sound)
end
local cat = Animal:new("Cat", "Meow")
cat:speak() -- Cat says MeowKonstruktormuster
Der Konstruktor :new(...) erstellt über setmetatable({}, cls) eine Instanz und ruft anschließend zur Initialisierung :init(...) auf. Dadurch werden Speicherzuweisung und Initialisierung getrennt.
Klassenname für das Debugging
Speichern Sie cls.__name und definieren Sie __tostring, damit Instanzen aussagekräftig ausgegeben werden.
function Animal:__tostring()
return "<" .. Animal.__name .. ": " .. self.name .. ">"
end
print(tostring(cat)) -- <Animal: Cat>Standardwerte in init
Stellen Sie in init mithilfe von or Standardwerte bereit.
function Vehicle:init(opts)
self.speed = opts.speed or 0
self.fuel = opts.fuel or 100
self.engine = opts.engine or "petrol"
endKlassenmethoden und Instanzmethoden
Mit function cls.method() definierte Methoden sind Klassenmethoden (ohne self). Mit function cls:method() definierte Methoden erhalten die Instanz als self.
Statische Eigenschaften
Eigenschaften, die direkt in der Klassentabelle gesetzt werden, werden von allen Instanzen gemeinsam genutzt (sofern sie nicht durch Instanzfelder überschrieben werden).
Animal.count = 0
function Animal:init(name, sound)
Animal.count = Animal.count + 1
self.name = name; self.sound = sound
end
print(Animal.count) -- 0
Animal:new("Dog","Woof")
print(Animal.count) -- 1Kopierkonstruktor
Eine Methode :clone() erstellt eine Kopie einer Instanz, indem sie deren Felder flach kopiert.
function Animal:clone()
local copy = setmetatable({}, getmetatable(self))
for k, v in pairs(self) do copy[k] = v end
return copy
endGleichheits-Metamethode
Definieren Sie __eq für aussagekräftige Gleichheitsvergleiche zwischen Instanzen.
Animal.__eq = function(a, b)
return a.name == b.name
endWarum nicht rawget?
Verwenden Sie self.field (nicht rawget), damit der feldbasierte Zugriff über Metamethoden in abgeleiteten Klassen möglich bleibt. Verwenden Sie rawget nur, wenn eine ausdrückliche Umgehung erforderlich ist.
Frage zum Konstruktordesign
Warum wird init getrennt vom new-Allocator aufgerufen?
Zusammenfassung: Basisklasse und Konstruktor
Eine Class()-Fabrik erstellt eine Tabelle als Klasse, setzt __index = cls für die Methodenauflösung und stellt :new() sowie :init() bereit. Dies bildet die Grundlage für alle Lua-OOP-Muster.
Häufig gestellte Fragen
Ist die Lektion „Entwurf von Basisklassen und Konstruktoren“ kostenlos?
Ja — der vollständige Text von „Entwurf von Basisklassen und Konstruktoren“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Lua Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Entwurf von Basisklassen und Konstruktoren“?
Entwerfen Sie eine Class()-Factory, die Metatabellen und new()-Konstruktoren einrichtet Du übst Lua Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Lua Academy zu starten?
Keine Vorkenntnisse erforderlich. Lua Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „Entwurf von Basisklassen und Konstruktoren“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Lua Academy-Lektion Code schreiben und ausführen?
Ja. Jede Lua Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Entwurf von Basisklassen und Konstruktoren
- Mehrstufige Vererbung
- Mixin-Komposition und Schnittstellenprüfungen
- instanceof und Typ-Introspektion