Condiviso vs specifico
Fa parte della sezione Programmazione orientata agli oggetti del percorso Lua di Coddy. Lezione 35 di 70.
Quando lavori con l'ereditarietà, è importante capire dove risiede ogni dato. Alcuni attributi sono condivisi: definiti nella classe genitore e accessibili a tutte le classi figlie. Altri sono unici: creati appositamente nella classe figlia o nell'istanza.
Considera questa gerarchia:
local Animal = {}
Animal.__index = Animal
Animal.kingdom = "Animalia" -- Condiviso: definito nella classe
function Animal:new(name)
local obj = {name = name} -- Univoco: memorizzato in ogni istanza
setmetatable(obj, Animal)
return obj
endlocal Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})
Dog.sound = "bark" -- Condiviso tra tutti i Dog
function Dog:new(name, breed)
local obj = Animal.new(Animal, name)
obj.breed = breed -- Unico: ogni Dog ha la propria razza
setmetatable(obj, Dog)
return obj
endQuando crei un'istanza di Dog, alcuni valori esistono direttamente sull'oggetto, mentre altri si trovano tramite la catena di ricerca:
local rex = Dog:new("Rex", "German Shepherd")
-- Unico per questa istanza (memorizzato in rex)
print(rex.name) -- "Rex"
print(rex.breed) -- "German Shepherd"-- Condiviso (trovato tramite ricerca)
print(rex.sound) -- "bark" (da Dog)
print(rex.kingdom) -- "Animalia" (da Animal)La distinzione fondamentale: i campi assegnati a obj nei costruttori sono unici per ogni istanza, mentre i campi definiti direttamente nelle tabelle di classe sono condivisi da tutte le istanze di quella classe e delle sue classi figlie.
Sfida
FacileEsploriamo come i dati fluiscono attraverso una gerarchia di ereditarietà costruendo un sistema di classi Creature e Dragon. Vedrai direttamente quali attributi sono condivisi tra tutte le istanze e quali sono unici per ogni singolo oggetto.
Organizzerai il codice in tre file:
Creature.lua: Definisci la classe genitore con un attributo condiviso a livello di classeworld = "Fantasy Realm"condiviso da tutte le creature. Includi un costruttore:new(name)che memorizzi il nome della creatura come attributo di istanza.Dragon.lua: Definisci la classe figlia che eredita da Creature. Aggiungi un attributo condiviso a livello di classeelement = "fire"condiviso da tutti i draghi. Il costruttore:new(name, color)deve chiamare il costruttore genitore per il nome, quindi aggiungerecolorcome attributo di istanza univoco per ogni drago.main.lua: Crea due draghi diversi e controlla i loro attributi per mostrare la differenza tra dati condivisi e univoci.
Riceverai due input:
- Il nome e il colore del primo drago, separati da una virgola (ad es.,
Smaug,red) - Il nome e il colore del secondo drago, separati da una virgola (ad es.,
Draco,gold)
Nel file principale, crea entrambi i draghi con i rispettivi nomi e colori. Poi stampa le seguenti informazioni esattamente in questo ordine:
namedel primo dragocolordel primo dragonamedel secondo dragocolordel secondo dragoelementdel primo drago (condiviso dalla classe Dragon)elementdel secondo drago (condiviso dalla classe Dragon)worlddel primo drago (condiviso dalla classe Creature)
Per esempio, se gli input sono Smaug,red e Draco,gold, l'output dovrebbe essere:
Smaug
red
Draco
gold
fire
fire
Fantasy RealmNota che name e color sono diversi per ogni drago (attributi di istanza univoci), mentre element e world sono uguali per entrambi (attributi di classe condivisi, trovati tramite la catena di ricerca).
Provalo tu
-- main.lua: Crea draghi e mostra la differenza tra attributi condivisi e attributi unici
local Dragon = require('Dragon')
-- Leggi l'input per il primo drago (nome,colore)
local input1 = io.read()
-- Leggi l'input per il secondo drago (nome,colore)
local input2 = io.read()
-- TODO: Analizza il primo input per estrarre nome e colore
-- Suggerimento: usa string.match con il pattern "([^,]+),([^,]+)"
-- TODO: Analizza il secondo input per estrarre nome e colore
-- TODO: Crea il primo drago con il suo nome e colore
-- TODO: Crea il secondo drago con il suo nome e colore
-- TODO: Stampa quanto segue nell'ordine indicato:
-- 1. Il nome del primo drago
-- 2. Il colore del primo drago
-- 3. Il nome del secondo drago
-- 4. Colore del secondo drago
-- 5. Elemento del primo drago (condiviso dalla classe Dragon)
-- 6. Elemento del secondo drago (condiviso dalla classe Dragon)
-- 7. Mondo del primo drago (condiviso dalla classe Creature)
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