Menu
Coddy logo textTech

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

Il 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 Poodle

Entrambi 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.

challenge icon

Sfida

Facile

Creiamo 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 classe Person con 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 old

Riceverai due input:

  1. Il nome della persona
  2. 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 old

Provalo 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
quiz iconMettiti alla prova

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

Esercitati da solo: Compilatore Lua online