Menu
CoddyTech

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