Ereditare i metodi
Fa parte della sezione Programmazione orientata agli oggetti del percorso Lua di Coddy. Lezione 32 di 70.
Una volta stabilito il collegamento di ereditarietà, le istanze della classe figlia ottengono automaticamente accesso a tutti i metodi della classe genitore. Questo avviene tramite la catena di ricerca di Lua: quando chiami un metodo su un'istanza, Lua cerca in ogni tabella collegata finché non trova ciò che stai cercando.
Considera questa configurazione in cui Animal definisce un metodo :breathe():
local Animal = {}
Animal.__index = Animal
function Animal:new()
local obj = {}
setmetatable(obj, Animal)
return obj
end
function Animal:breathe()
print("Breathing...")
end
-- Dog eredita da Animal
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})
function Dog:new()
local obj = {}
setmetatable(obj, Dog)
return obj
endOra osserva cosa succede quando creiamo un Dog e chiamiamo il metodo della classe genitore:
local buddy = Dog:new()
buddy:breathe() -- Output: Breathing...La classe Dog non ha mai definito :breathe(), eppure funziona. Lua controlla prima buddy, non trova nulla, poi controlla Dog, ancora nulla, e infine lo trova in Animal. Questa ereditarietà automatica dei metodi significa che scrivi il comportamento condiviso una sola volta nella classe genitore e ogni classe figlia ne beneficia subito.
Sfida
FacileCostruiamo una semplice gerarchia di creature per vedere l'ereditarietà dei metodi in azione! Creerai una classe genitore Animal e una classe figlia Dog, poi dimostrerai che le istanze di Dog possono usare i metodi definiti solo in Animal.
Organizzerai il codice in tre file:
Animal.lua: Definisci la classe genitore usando il modello standard per le classi. Includi un costruttore:new(name)che memorizza il nome dell'animale e un metodo:speak()che stampa il nome dell'animale seguito damakes a sound. Restituisci la classe alla fine del file.Dog.lua: Definisci la classe figlia che eredita da Animal. Richiedi il modulo Animal e imposta il collegamento di ereditarietà in modo che Dog possa accedere ai metodi di Animal. Includi un costruttore:new(name)che memorizza il nome e imposta Dog come metatable. La classe Dog NON deve definire un proprio metodo:speak(). Lo erediterà da Animal.main.lua: Richiedi il modulo Dog, leggi un nome dall'input, crea un'istanza di Dog con quel nome e chiamane il metodo:speak().
Riceverai un input: il nome del cane.
Per esempio, se l'input è Buddy, l'output dovrebbe essere:
Buddy makes a soundLa magia sta nel fatto che la classe Dog non definisce mai :speak(), eppure chiamarlo su un'istanza di Dog funziona perfettamente. Lua segue la catena di ricerca dall'istanza di Dog alla classe Dog, poi alla classe Animal, dove trova il metodo. Questa è l'ereditarietà in azione!
Provalo tu
-- main.lua: Punto de entrada
local Dog = require('Dog')
-- Leggi il nome del cane dall'input
local name = io.read()
-- TODO: Crea un'istanza di Dog con il nome fornito
-- TODO: Chiama il metodo :speak() sull'istanza di Dog
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