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: 5Anche 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.
Sfida
FacileDimostriamo 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 classeWalletusando il modello standard del costruttore. Ogni wallet deve tenere traccia del propriobalance. 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
- Un costruttore
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:
- Saldo iniziale del wallet A
- Saldo iniziale del wallet B
- Importo da aggiungere al wallet A
- Importo da spendere dal wallet B
Nel file principale:
- Crea
walletAcon il primo saldo iniziale - Crea
walletBcon il secondo saldo iniziale - Aggiungi l’importo specificato a
walletA - Spendi l’importo specificato da
walletB - 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: 40Nota 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]"
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