Progettazione della classe base e del costruttore
Progetti una factory Class() che configuri metatabelle e costruttori new().
Progettazione della classe base e del costruttore è una lezione Lua Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Lua Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Lua Academy include 4 lezioni in totale.
Obiettivo: una factory riutilizzabile per le classi
Si desidera una funzione Class() che restituisca un nuovo oggetto classe con un costruttore corretto, la ricerca dei metodi e la semantica OOP.
Struttura di base della factory per le classi
La factory crea una tabella classe con una metatabella per la distribuzione dei metodi.
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
endDefinizione di una classe
Crei una classe, definisca init (il costruttore) e aggiunga i metodi.
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 MeowPattern del costruttore
Il costruttore :new(...) crea un'istanza tramite setmetatable({}, cls), quindi chiama :init(...) per inizializzarla. In questo modo l'allocazione viene separata dall'inizializzazione.
Nome della classe per il debugging
Memorizzi cls.__name e definisca __tostring in modo che le istanze vengano visualizzate in modo significativo.
function Animal:__tostring()
return "<" .. Animal.__name .. ": " .. self.name .. ">"
end
print(tostring(cat)) -- <Animal: Cat>Valori predefiniti in init
Fornisca valori predefiniti in init utilizzando or.
function Vehicle:init(opts)
self.speed = opts.speed or 0
self.fuel = opts.fuel or 100
self.engine = opts.engine or "petrol"
endMetodi di classe e metodi di istanza
I metodi definiti con function cls.method() sono metodi di classe (senza self). I metodi definiti con function cls:method() ricevono l'istanza come self.
Proprietà statiche
Le proprietà impostate direttamente sulla tabella classe sono condivise da tutte le istanze (a meno che non vengano nascoste da campi dell'istanza).
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) -- 1Costruttore di copia
Un metodo :clone() crea una copia di un'istanza copiandone superficialmente i campi.
function Animal:clone()
local copy = setmetatable({}, getmetatable(self))
for k, v in pairs(self) do copy[k] = v end
return copy
endMetametodo di uguaglianza
Definisca __eq per ottenere confronti di uguaglianza significativi tra le istanze.
Animal.__eq = function(a, b)
return a.name == b.name
endPerché non utilizzare rawget?
Utilizzi self.field (non rawget) per consentire l'accesso ai campi basato sui metametodi nelle classi derivate. Utilizzi rawget solo quando è necessario escludere esplicitamente questo comportamento.
Domanda sulla progettazione del costruttore
Perché init viene chiamato separatamente dall'allocatore new?
Riepilogo: classe base e costruttore
Una factory Class() crea una tabella come classe, imposta __index = cls per la ricerca dei metodi e fornisce :new() + :init(). Questa è la base di tutti i pattern OOP in Lua.
Domande Frequenti
La lezione «Progettazione della classe base e del costruttore» è gratuita?
Sì — il testo completo di «Progettazione della classe base e del costruttore» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Lua Academy, passa a CoddyKit PRO. Il corso Lua Academy include 4 lezioni in totale.
Cosa imparerò in «Progettazione della classe base e del costruttore»?
Progetti una factory Class() che configuri metatabelle e costruttori new(). Eserciti Lua Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Lua Academy?
Non è richiesta alcuna esperienza precedente. Lua Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «Progettazione della classe base e del costruttore»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Lua Academy?
Sì. Ogni lezione Lua Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Progettazione della classe base e del costruttore
- Ereditarietà multilivello
- Composizione dei mixin e verifica delle interfacce
- instanceof e introspezione dei tipi