Il costruttore :new()
Fa parte della sezione Programmazione orientata agli oggetti del percorso Lua di Coddy. Lezione 8 di 70.
Creare oggetti manualmente, creare una tabella vuota, impostarne la metatabella e collegare __index diventa ripetitivo. La soluzione standard consiste nel definire direttamente nella classe un metodo costruttore :new() che si occupa di tutto questo per te.
Ecco lo schema:
local Dog = {}
Dog.__index = Dog
function Dog:new()
local instance = {}
setmetatable(instance, self)
return instance
end
function Dog:bark()
print("Woof!")
endAnalizziamo cosa succede all’interno di :new(). Per prima cosa, creiamo una tabella vuota chiamata instance. Poi impostiamo la sua metatabella su self, che è Dog quando chiamiamo Dog:new().
Poiché Dog.__index punta a Dog stesso, l’istanza può trovare tutti i metodi definiti in Dog. Infine, restituiamo il nuovo oggetto.
Nota la riga Dog.__index = Dog al di fuori del costruttore. È una scorciatoia comune: invece di creare una metatabella separata, la tabella della classe funge sia da prototipo sia da metatabella.
Ora la creazione di oggetti è semplice e coerente:
local myDog = Dog:new()
myDog:bark() -- Output: Woof!Ogni classe che crei seguirà questa stessa struttura. Il costruttore :new() diventa il punto unico in cui avviene la creazione degli oggetti, rendendo il tuo codice organizzato e prevedibile.
Sfida
FacileCostruiamo una classe Cat usando il modello standard del costruttore che hai appena imparato. Organizzerai il codice in due file per esercitarti con la struttura corretta dei moduli.
Creerai:
Cat.lua: definisci la classeCatcon il modello completo del costruttore. La tua classe dovrebbe includere:- La tabella della classe con
__indexche punta a sé stessa - Un costruttore
:new()che crea un'istanza, imposta la sua metatable e la restituisce - Un metodo
:meow()che stampa il verso del gatto
- La tabella della classe con
main.lua: richiedi il modulo Cat e usa il costruttore per creare un'istanza del gatto. Poi chiama il suo metodo per verificare che tutto sia collegato correttamente.
Riceverai un input: il numero di volte che il tuo gatto dovrebbe miagolare.
Il tuo metodo :meow() dovrebbe stampare esattamente:
Meow!Nel file principale, crea un gatto usando Cat:new() e chiama :meow() il numero di volte specificato.
Per esempio, se l'input è 3, l'output dovrebbe essere:
Meow!
Meow!
Meow!Provalo tu
-- Carica il modulo Cat
local Cat = require('Cat')
-- Leggi l'input: numero di volte in cui miagolare
local times = tonumber(io.read())
-- TODO: Crea un'istanza di Cat usando Cat:new()
-- TODO: Chiama il metodo :meow() il numero di volte specificato
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Il concetto di «self»
Tabelle con funzioni«self» esplicitoLa sintassi dei due puntiPunto o due puntiRiepilogo - Spostare il punto4Progetto: Banca digitale
Configurazione del progettoMetodo di deposito2Schema del prototipo di classe
Il concetto di prototipoCollegare con __indexIl costruttore :new()Inizializzare gli attributiIstanze indipendentiRiepilogo - Fabbrica di auto5Sovraccarico degli operatori nella OOP
Sommare oggettiSottrarre oggettiConcatenare oggettiConfrontare oggetti (<, >)Ripasso - Calcoli con il portafoglio8Incapsulamento
Convenzioni di denominazioneClosure per la privacyAccesso tramite closureTabelle di sola letturaLogica di convalidaRiepilogo - Cassaforte sicura11Modelli di progettazione (base)
Funzioni factoryTabella singletonPattern IteratorObserver (listener)Riepilogo - Factory per logger3Stato e comportamento degli oggetti
Variabili di istanzaMetodi getterMetodi setterProprietà calcolateFormattazione delle stringheControlli di uguaglianzaRiepilogo - Voto dello studente6Fondamenti dell'ereditarietà
Configurare l'ereditarietàEreditare i metodiEstendere il costruttoreAggiungere metodi alla classe figliaCondiviso vs specificoRiepilogo - Gerarchia delle formeEsercitati da solo: Compilatore Lua online