Menu
Coddy logo textTech

Riepilogo - Gerarchia delle forme

Fa parte della sezione Programmazione orientata agli oggetti del percorso Lua di Coddy. Lezione 36 di 70.

challenge icon

Sfida

Facile

Costruiamo da zero una gerarchia completa di forme! Creerai una classe genitore Shape da cui ereditano tutte le forme, poi creerai le classi figlie Circle e Square, ciascuna con proprietà uniche e funzionalità condivise.

Organizzerai il codice in quattro file:

  • Shape.lua: la classe base da cui erediteranno tutte le forme. Dovrebbe avere un costruttore :new(color) che memorizza il colore della forma e un metodo :getColor() che lo restituisce. Grazie a questa proprietà condivisa, ogni forma, che sia un cerchio o un quadrato, avrà un colore.
  • Circle.lua: una classe figlia che eredita da Shape. Il suo costruttore :new(color, radius) dovrebbe chiamare il costruttore genitore per il colore, poi aggiungere il raggio come attributo univoco. Includi un metodo :describe() che stampa i dettagli del cerchio.
  • Square.lua: un'altra classe figlia che eredita da Shape. Anche il suo costruttore :new(color, side) dovrebbe chiamare il costruttore genitore, poi memorizzare la lunghezza del lato. Includi anche un metodo :describe() per i quadrati.
  • main.lua: metti insieme il tutto creando istanze di entrambe le forme e dimostrando che ereditano correttamente da Shape, mantenendo al contempo le loro proprietà uniche.

Riceverai due input:

  1. Dati del cerchio: colore e raggio separati da una virgola (ad es., blue,5)
  2. Dati del quadrato: colore e lunghezza del lato separati da una virgola (ad es., red,4)

Nel tuo file principale, crea un Circle e un Square con i valori specificati. Poi stampa quanto segue su righe separate:

  1. Chiama :describe() sul cerchio
  2. Chiama :describe() sul quadrato
  3. Stampa il colore del cerchio usando :getColor()
  4. Stampa il colore del quadrato usando :getColor()

Il metodo :describe() di Circle dovrebbe stampare:

Circle with radius {radius}

Il metodo :describe() di Square dovrebbe stampare:

Square with side {side}

Ad esempio, se gli input sono blue,5 e red,4, l'output dovrebbe essere:

Circle with radius 5
Square with side 4
blue
red

Questo dimostra il modello completo di ereditarietà: entrambe le forme ereditano :getColor() da Shape (non lo definiscono mai direttamente), mentre ciascuna ha il proprio attributo univoco e il proprio metodo :describe()!

Provalo tu

-- main.lua: Metti tutto insieme

local Circle = require('Circle')
local Square = require('Square')

-- Leggi l'input per il cerchio (color,radius)
local circleInput = io.read()
local circleColor, circleRadius = circleInput:match("([^,]+),([^,]+)")
circleRadius = tonumber(circleRadius)

-- Leggi l'input per il quadrato (color,side)
local squareInput = io.read()
local squareColor, squareSide = squareInput:match("([^,]+),([^,]+)")
squareSide = tonumber(squareSide)

-- TODO: Crea un'istanza di Circle con il colore e il raggio indicati

-- TODO: Crea un'istanza di Square con il colore e il lato indicati

-- TODO: Chiama :describe() sul cerchio

-- TODO: Chiama :describe() sul quadrato

-- TODO: Stampa il colore del cerchio usando :getColor()

-- TODO: Stampa il colore del quadrato usando :getColor()

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Lua online