Menu
Coddy logo textTech

Raccolta di forme

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

challenge icon

Sfida

Facile

Ora che hai entrambe le classi Rectangle e Circle con tutte le funzionalità, creiamo una classe ShapeCollection che possa gestire più forme insieme. Questo è un ottimo esempio di composizione: la raccolta "has" forme invece di "being" una forma.

Aggiungerai un nuovo file al progetto che sta crescendo:

  • Shape.lua: la tua classe base Shape (invariata).
  • Rectangle.lua: la tua classe Rectangle con :getArea() e :getPerimeter().
  • Circle.lua: la tua classe Circle con :getArea() e :getPerimeter().
  • ShapeCollection.lua: crea una nuova classe che memorizza internamente le forme. Includi un costruttore :new() che inizializza un elenco vuoto di forme, un metodo :addShape(shape) che aggiunge qualsiasi forma alla raccolta e un metodo :count() che restituisce il numero di forme attualmente memorizzate.
  • main.lua: riunisci tutto richiedendo i tuoi moduli. Leggi le dimensioni dall'input, crea un Rectangle e un Circle, aggiungili entrambi a una ShapeCollection, quindi stampa il numero di elementi della raccolta seguito dal nome di ogni forma (nell'ordine in cui sono state aggiunte).

ShapeCollection non deve sapere se sta memorizzando rettangoli o cerchi. Contiene semplicemente delle forme. Questo dimostra come il polimorfismo consenta di trattare in modo uniforme diversi tipi di oggetti attraverso un'interfaccia comune.

Input: tre righe: larghezza (numero), altezza (numero) e raggio (numero).

Output: tre righe: il numero di forme nella raccolta, poi il nome della prima forma aggiunta e infine il nome della seconda forma aggiunta.

Provalo tu

-- Carica il modulo Rectangle
local Rectangle = require('Rectangle')

-- Carica il modulo Circle
local Circle = require('Circle')

-- Carica il modulo ShapeCollection
local ShapeCollection = require('ShapeCollection')

-- Leggi width e height dall'input
local width = tonumber(io.read())
local height = tonumber(io.read())
local radius = tonumber(io.read())

-- Crea una nuova istanza di Rectangle con le dimensioni specificate
local rect = Rectangle:new(width, height)

-- Crea una nuova istanza di Circle con il raggio specificato
local circ = Circle:new(radius)

-- Crea una nuova ShapeCollection
local collection = ShapeCollection:new()

-- Aggiungi entrambe le forme alla collezione
collection:addShape(rect)
collection:addShape(circ)

-- Stampa il numero di forme nella collezione
print(collection:count())

-- Stampa il nome di ogni forma nell'ordine in cui è stata aggiunta
for i = 1, collection:count() do
    print(collection.shapes[i]:getName())
end

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Lua online