Menu
Coddy logo textTech

Area totale

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

challenge icon

Sfida

Facile

Aggiungiamo una funzionalità potente alla tua ShapeCollection: la possibilità di calcolare l’area totale di tutte le forme che contiene. È qui che il polimorfismo dà il meglio di sé: la tua raccolta può chiamare :getArea() su qualsiasi forma senza sapere se si tratta di un rettangolo o di un cerchio.

Continuerai a lavorare sui file del progetto che hai già creato:

  • Shape.lua: la tua classe Shape di base (invariata).
  • Rectangle.lua: la tua classe Rectangle con :getArea() e :getPerimeter().
  • Circle.lua: la tua classe Circle con :getArea() e :getPerimeter().
  • ShapeCollection.lua: estendi la tua classe raccolta aggiungendo un metodo :getTotalArea(). Questo metodo deve scorrere tutte le forme memorizzate, chiamare :getArea() su ciascuna e restituire la somma di tutte le aree.
  • main.lua: richiedi i tuoi moduli, leggi le dimensioni dall’input, crea un Rectangle e un Circle, aggiungili entrambi a una ShapeCollection, quindi stampa l’area totale di tutte le forme nella raccolta.

Il bello di questo approccio è che :getTotalArea() non ha bisogno di una logica distinta per rettangoli e cerchi. Si limita a presumere che ogni forma della raccolta abbia un metodo :getArea(). In seguito potresti aggiungere triangoli, esagoni o qualsiasi altra forma, e il calcolo dell’area totale funzionerebbe senza modifiche.

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

Output: Una singola riga contenente l’area totale di tutte le forme nella raccolta.

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 indicate
local rect = Rectangle:new(width, height)

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

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

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

-- Stampa l'area totale di tutte le forme nella raccolta
print(collection:getTotalArea())

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Lua online