Metodo del perimetro
Fa parte della sezione Programmazione orientata agli oggetti del percorso Lua di Coddy. Lezione 58 di 70.
Sfida
FacileEstendiamo il nostro Shape Manager aggiungendo un metodo :getPerimeter() sia alla classe Rectangle sia alla classe Circle. Proprio come con :getArea(), ogni forma calcola il proprio perimetro in modo diverso, ma entrambe condividono lo stesso nome del metodo: un esempio perfetto di polimorfismo in azione.
Continuerai a lavorare con i file esistenti:
Shape.lua: la classe Shape di base rimane invariata.Rectangle.lua: aggiungi un metodo:getPerimeter()che restituisca il perimetro del rettangolo usando la formula 2 × (width + height).Circle.lua: aggiungi un metodo:getPerimeter()che restituisca la circonferenza del cerchio usando la formula 2 × π × radius. Usamath.piper π.main.lua: richiedi entrambi i moduli delle forme, leggi le dimensioni dall'input, crea un Rectangle e un Circle, quindi stampa sei righe: il nome, l'area e il perimetro del rettangolo, seguiti dal nome, dall'area e dal perimetro del cerchio.
Ora entrambe le forme hanno un'interfaccia completa con :getName(), :getArea() e :getPerimeter(): tutto è accessibile tramite gli stessi nomi di metodo, nonostante le diverse implementazioni.
Input: tre righe: width (numero), height (numero) e radius (numero).
Output: sei righe in quest'ordine: nome del rettangolo, area del rettangolo, perimetro del rettangolo, nome del cerchio, area del cerchio, perimetro del cerchio.
Provalo tu
-- Carica il modulo Rectangle
local Rectangle = require('Rectangle')
-- Carica il modulo Circle
local Circle = require('Circle')
-- 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)
-- Stampa il nome, l'area e il perimetro del rettangolo
print(rect:getName())
print(rect:getArea())
print(rect:getPerimeter())
-- Stampa il nome, l'area e il perimetro del cerchio
print(circ:getName())
print(circ:getArea())
print(circ:getPerimeter())
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