Raccolta di forme
Fa parte della sezione Programmazione orientata agli oggetti del percorso Lua di Coddy. Lezione 59 di 70.
Sfida
FacileOra 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
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