Menu
Coddy logo textTech

Istanze indipendenti

Fa parte della sezione Programmazione orientata agli oggetti del percorso Lua di Coddy. Lezione 10 di 70.

Un aspetto fondamentale della programmazione orientata agli oggetti è che ogni istanza mantiene il proprio stato separato. Quando crei due oggetti dalla stessa classe, sono completamente indipendenti: modificare uno non influisce sull'altro.

Considera questo esempio:

local Counter = {}
Counter.__index = Counter

function Counter:new(start)
    local instance = {}
    setmetatable(instance, self)
    instance.value = start or 0
    return instance
end

function Counter:increment()
    self.value = self.value + 1
end

-- Crea dos contadores independientes
local counterA = Counter:new(10)
local counterB = Counter:new(5)

counterA:increment()
counterA:increment()

print(counterA.value)  -- Salida: 12
print(counterB.value)  -- Salida: 5

Anche se entrambi i contatori provengono dalla stessa classe Counter, incrementare counterA non ha alcun effetto su counterB. Ogni oggetto ha il proprio campo value memorizzato nella propria tabella dell'istanza.

Questa indipendenza è ciò che rende utili gli oggetti. Puoi creare decine di giocatori in un gioco, ognuno con la propria salute e il proprio punteggio. Puoi gestire più conti bancari, ciascuno con un saldo diverso.

La classe definisce la struttura e il comportamento, ma ogni istanza vive di vita propria con i propri dati.

challenge icon

Sfida

Facile

Dimostriamo che gli oggetti della stessa classe vivono davvero vite indipendenti! Creerai una classe Wallet e due istanze separate di wallet, poi le modificherai in modo indipendente per dimostrare che le modifiche a una non influiscono sull’altra.

Organizzerai il codice in due file:

  • Wallet.lua: definisci la classe Wallet usando il modello standard del costruttore. Ogni wallet deve tenere traccia del proprio balance. Includi:
    • Un costruttore :new(startingBalance) che inizializza il wallet con l’importo specificato
    • Un metodo :add(amount) che aumenta il saldo
    • Un metodo :spend(amount) che diminuisce il saldo
  • main.lua: importa il modulo Wallet e crea due istanze separate di wallet. Esegui operazioni diverse su ciascuna per mostrare che mantengono uno stato indipendente.

Riceverai quattro input:

  1. Saldo iniziale del wallet A
  2. Saldo iniziale del wallet B
  3. Importo da aggiungere al wallet A
  4. Importo da spendere dal wallet B

Nel file principale:

  1. Crea walletA con il primo saldo iniziale
  2. Crea walletB con il secondo saldo iniziale
  3. Aggiungi l’importo specificato a walletA
  4. Spendi l’importo specificato da walletB
  5. Stampa entrambi i saldi su righe separate

Stampa i saldi finali esattamente in questo formato:

Wallet A: [balance]
Wallet B: [balance]

Ad esempio, se gli input sono 100, 50, 25 e 10, l’output dovrebbe essere:

Wallet A: 125
Wallet B: 40

Nota come aggiungere fondi al wallet A non modifica il wallet B e come spendere dal wallet B non influisce sul wallet A: ogni istanza mantiene il proprio saldo separato.

Provalo tu

-- Importa il modulo Wallet
local Wallet = require('Wallet')

-- Leggi i valori in input
local startingA = tonumber(io.read())
local startingB = tonumber(io.read())
local addAmount = tonumber(io.read())
local spendAmount = tonumber(io.read())

-- TODO: Crea walletA con il primo saldo iniziale

-- TODO: Crea walletB con il secondo saldo iniziale

-- TODO: Aggiungi l'importo specificato a walletA

-- TODO: Spendi l'importo specificato da walletB

-- TODO: Stampa i saldi finali nel formato richiesto
-- Formato: "Wallet A: [balance]" e "Wallet B: [balance]"
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