Inizializzare gli attributi
Fa parte della sezione Programmazione orientata agli oggetti del percorso Lua di Coddy. Lezione 9 di 70.
Il costruttore :new() che hai imparato crea oggetti, ma ogni istanza inizia in modo identico. Gli oggetti reali hanno bisogno di dati univoci: una persona ha un nome specifico, un giocatore ha un punteggio iniziale. Per rendere utili gli oggetti, il costruttore deve accettare argomenti e assegnarli alla nuova istanza.
Ecco come espandere il costruttore per accettare valori iniziali:
local Dog = {}
Dog.__index = Dog
function Dog:new(name, breed)
local instance = {}
setmetatable(instance, self)
instance.name = name
instance.breed = breed
return instance
end
function Dog:introduce()
print("I am " .. self.name .. ", a " .. self.breed)
endIl costruttore ora accetta name e breed come parametri. Dopo aver creato l'istanza vuota e averne impostato la metatable, assegniamo questi valori direttamente ai campi dell'istanza. Ogni oggetto creato avrà il proprio name e breed.
local dog1 = Dog:new("Rex", "German Shepherd")
local dog2 = Dog:new("Bella", "Poodle")
dog1:introduce() -- Output: I am Rex, a German Shepherd
dog2:introduce() -- Output: I am Bella, a PoodleEntrambi i cani condividono lo stesso metodo :introduce() del prototipo, ma ognuno ha il proprio nome e la propria razza unici memorizzati nella sua tabella di istanza. Questo è il potere di combinare i prototipi con i costruttori parametrizzati: comportamento condiviso con stato individuale.
Sfida
FacileCreiamo una classe Person che crea individui unici, con i propri nomi e le proprie età. Organizzerai il codice in due file per esercitarti con una corretta struttura dei moduli.
Creerai:
Person.lua: definisci la classePersoncon un costruttore che accetta un nome e un'età. Includi un metodo:introduce()che permette a ogni persona di presentarsi.main.lua: carica il modulo Person con require e crea un'istanza di persona usando gli input forniti. Poi falla presentare.
Il costruttore :new(name, age) deve accettare entrambi i valori e memorizzarli nella nuova istanza. Il metodo :introduce() deve stampare esattamente nel seguente formato:
Hello, my name is [name] and I am [age] years oldRiceverai due input:
- Il nome della persona
- L'età della persona
Per esempio, se gli input sono Alice e 25, l'output dovrebbe essere:
Hello, my name is Alice and I am 25 years oldProvalo tu
-- Carica il modulo Person
local Person = require('Person')
-- Leggi l'input
local name = io.read()
local age = io.read()
-- TODO: Crea una nuova istanza di Person usando Person:new(name, age)
-- TODO: Chiama il metodo introduce() sulla tua istanza di Person
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