0Pricing
Lua Academy · Lektion

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
end

Eine 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 Meow

Konstruktormuster

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

Klassenmethoden 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)  -- 1

Kopierkonstruktor

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
end

Gleichheits-Metamethode

Definieren Sie __eq für aussagekräftige Gleichheitsvergleiche zwischen Instanzen.

Animal.__eq = function(a, b)
  return a.name == b.name
end

Warum 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

  1. Entwurf von Basisklassen und Konstruktoren
  2. Mehrstufige Vererbung
  3. Mixin-Komposition und Schnittstellenprüfungen
  4. instanceof und Typ-Introspektion
← Zurück zu Lua Academy