Menu
Coddy logo textTech

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
end
local 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
end

Quando 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.

challenge icon

Sfida

Facile

Esploriamo 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 classe world = "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 classe element = "fire" condiviso da tutti i draghi. Il costruttore :new(name, color) deve chiamare il costruttore genitore per il nome, quindi aggiungere color come 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:

  1. Il nome e il colore del primo drago, separati da una virgola (ad es., Smaug,red)
  2. 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:

  1. name del primo drago
  2. color del primo drago
  3. name del secondo drago
  4. color del secondo drago
  5. element del primo drago (condiviso dalla classe Dragon)
  6. element del secondo drago (condiviso dalla classe Dragon)
  7. world del 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 Realm

Nota 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)
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