Area totale
Fa parte della sezione Programmazione orientata agli oggetti del percorso Lua di Coddy. Lezione 60 di 70.
Sfida
FacileAggiungiamo 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
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 deposito7Polimorfismo e sovrascrittura
Sovrascrivere i metodiChiamare i metodi della classe genitoreDuck TypingInterfaccia comuneVerificare il tipoRiepilogo - Ruoli dei dipendenti10Progetto: Gestore di forme
Configurazione del progettoClasse RettangoloClasse CerchioMetodo del perimetroRaccolta di formeArea totaleFiltrare le forme2Schema 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