Metodi getter
Fa parte della sezione Programmazione orientata agli oggetti del percorso Lua di Coddy. Lezione 13 di 70.
Hai imparato a memorizzare i dati in variabili di istanza come self.health o self.items. Anche se puoi accedere direttamente a questi campi dall'esterno dell'oggetto, c'è un approccio più pulito: usare i metodi getter.
Un getter (chiamato anche metodo di accesso) è un metodo semplice che restituisce un valore interno. Invece di accedere direttamente a player.health, chiami player:getHealth():
local Player = {}
Player.__index = Player
function Player:new(name)
local instance = {}
setmetatable(instance, self)
instance.name = name
instance.health = 100
return instance
end
function Player:getHealth()
return self.health
end
function Player:getName()
return self.name
endPerché preoccuparsi di un metodo in più? I metodi getter forniscono un punto di accesso controllato ai tuoi dati.
Al momento, :getHealth() restituisce semplicemente il valore. Ma in seguito potresti voler aggiungere della logica: magari restituire "Critical" se la salute scende sotto 10, oppure registrare un log ogni volta che viene controllata la salute.
Con un getter in posizione, puoi apportare queste modifiche senza modificare il codice che usa l'oggetto.
local hero = Player:new("Luna")
print(hero:getHealth()) -- Output: 100
print(hero:getName()) -- Output: LunaQuesto schema crea un confine chiaro tra la struttura interna di un oggetto e il modo in cui altro codice interagisce con esso. Il mondo esterno richiede dati tramite metodi, invece di accedere direttamente ai campi dell'oggetto.
Sfida
FacileCostruiamo una classe Player che usa metodi getter per accedere ai propri dati interni. Invece di accedere direttamente ai campi del giocatore, creerai metodi che consentono un accesso controllato alle informazioni del giocatore.
Organizzerai il codice in due file:
Player.lua: Definisci la classePlayerusando il modello standard basato sui prototipi. Il costruttore deve accettare un nome e inizializzare la salute a100. Aggiungi tre metodi getter::getName()restituisce il nome del giocatore:getHealth()restituisce la salute attuale del giocatore:getStatus()restituisce una stringa formattata che combina entrambe le informazioni
main.lua: Importa il modulo Player e crea un'istanza del giocatore. Usa i metodi getter per mostrare le informazioni del giocatore: accedi a tutto tramite i metodi, invece di leggere direttamente i campi.
Il metodo :getStatus() deve restituire una stringa nel seguente formato esatto:
[name] has [health] HPRiceverai un input: il nome del giocatore.
Nel tuo file principale, crea un giocatore con il nome fornito, quindi stampa tre righe usando i metodi getter:
- Il nome del giocatore (usando
:getName()) - La salute del giocatore (usando
:getHealth()) - Lo stato completo del giocatore (usando
:getStatus())
Per esempio, se l'input è Luna, l'output dovrebbe essere:
Luna
100
Luna has 100 HPProvalo tu
-- Carica il modulo Player
local Player = require('Player')
-- Leggi l'input
local name = io.read()
-- TODO: Crea un'istanza di Player con il nome fornito
-- TODO: Stampa il nome del giocatore usando :getName()
-- TODO: Stampa la salute del giocatore usando :getHealth()
-- TODO: Stampa lo stato del giocatore usando :getStatus()
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