Gesamtfläche
Teil des Abschnitts Objektorientierte Programmierung der Lua-Journey von Coddy. Lektion 60 von 70.
Aufgabe
EinfachFügen wir deiner ShapeCollection eine leistungsstarke Funktion hinzu: die Möglichkeit, die Gesamtfläche aller darin enthaltenen Formen zu berechnen. Hier zeigt sich die Stärke der Polymorphie: Deine Sammlung kann für jede Form :getArea() aufrufen, ohne zu wissen, ob es sich um ein Rechteck oder einen Kreis handelt.
Du wirst auf deinen vorhandenen Projektdateien weiter aufbauen:
Shape.lua: Deine Basisklasse Shape (unverändert).Rectangle.lua: Deine Klasse Rectangle mit:getArea()und:getPerimeter().Circle.lua: Deine Klasse Circle mit:getArea()und:getPerimeter().ShapeCollection.lua: Erweitere deine Sammlungsklasse, indem du eine:getTotalArea()-Methode hinzufügst. Diese Methode sollte durch alle gespeicherten Formen iterieren, für jede:getArea()aufrufen und die Summe aller Flächen zurückgeben.main.lua: Fordere deine Module an, lies die Maße aus der Eingabe, erstelle ein Rectangle und einen Circle, füge beide zu einer ShapeCollection hinzu und gib anschließend die Gesamtfläche aller Formen in der Sammlung aus.
Das Schöne an diesem Ansatz ist, dass :getTotalArea() keine separate Logik für Rechtecke und Kreise benötigt. Die Methode vertraut einfach darauf, dass jede Form in der Sammlung über eine :getArea()-Methode verfügt. Du könntest später Dreiecke, Sechsecke oder beliebige andere Formen hinzufügen, und die Berechnung der Gesamtfläche würde ohne Änderungen funktionieren.
Eingabe: Drei Zeilen: Breite (Zahl), Höhe (Zahl) und Radius (Zahl).
Ausgabe: Eine einzelne Zeile mit der Gesamtfläche aller Formen in der Sammlung.
Probier es selbst
-- Das Rectangle-Modul laden
local Rectangle = require('Rectangle')
-- Das Circle-Modul laden
local Circle = require('Circle')
-- Das ShapeCollection-Modul laden
local ShapeCollection = require('ShapeCollection')
-- Breite und Höhe von der Eingabe lesen
local width = tonumber(io.read())
local height = tonumber(io.read())
local radius = tonumber(io.read())
-- Eine neue Rectangle-Instanz mit den gegebenen Abmessungen erstellen
local rect = Rectangle:new(width, height)
-- Eine neue Circle-Instanz mit dem gegebenen Radius erstellen
local circ = Circle:new(radius)
-- Eine neue ShapeCollection erstellen
local collection = ShapeCollection:new()
-- Beide Formen zur Sammlung hinzufügen
collection:addShape(rect)
collection:addShape(circ)
-- Die Gesamtfläche aller Formen in der Sammlung ausgeben
print(collection:getTotalArea())
Alle Lektionen in Objektorientierte Programmierung
1Das 'self'-Konzept
Tabellen mit FunktionenExplizites 'self'Die Doppelpunkt-SyntaxPunkt vs. DoppelpunktZusammenfassung – Beweglicher Punkt4Projekt: Digitale Bank
Projekt-SetupEinzahlungsmethode7Polymorphie & Überschreiben
Methoden überschreibenElternmethoden aufrufenDuck TypingGemeinsames InterfaceTyp prüfenRückblick - Mitarbeiterrollen10Projekt: Formen-Manager
Projekt-SetupRechteck-KlasseKreis-KlasseUmfang-MethodeFormen-SammlungGesamtflächeFormen filtern2Klassen-Prototyp-Muster
Das Prototyp-KonzeptVerknüpfung mit __indexDer :new()-KonstruktorAttribute initialisierenUnabhängige InstanzenZusammenfassung – Autofabrik5Operatorüberladung in OOP
Objekte addierenObjekte subtrahierenObjekte verkettenObjekte vergleichen (<, >)Rückblick – Wallet-Mathematik3Objektzustand und -verhalten
InstanzvariablenGetter-MethodenSetter-MethodenBerechnete EigenschaftenStrings formatierenGleichheitsprüfungenZusammenfassung – Studentennote6Grundlagen der Vererbung
Das Vererbungs-SetupMethoden vererbenDen Konstruktor erweiternChild-Methoden hinzufügenGemeinsam vs. EinzigartigZusammenfassung - Formen-Hierarchie9Komposition & Mixins
Has-A-BeziehungDelegationEinfache MixinsAnwendung mehrerer MixinsMixins vs. VererbungZusammenfassung – Roboter-Montage12Abschluss-Herausforderungen
Wiederholung - InventarsystemWiederholung - BenutzerverwaltungWiederholung - Score-TrackerFinaler OOP-CheckÜbe selbstständig: Online-Lua-Compiler