Umfang-Methode
Teil des Abschnitts Object Oriented Programming der Lua-Journey von Coddy — Lektion 58 von 70.
Aufgabe
EinfachLassen Sie uns unseren Shape Manager erweitern, indem wir sowohl der Rectangle- als auch der Circle-Klasse eine :getPerimeter()-Methode hinzufügen. Genau wie bei :getArea() berechnet jede Form ihren Umfang anders, aber sie teilen denselben Methodennamen – ein perfektes Beispiel für Polymorphismus in Aktion.
Sie werden weiterhin mit Ihren bestehenden Dateien arbeiten:
Shape.lua: Ihre Basisklasse Shape bleibt unverändert.Rectangle.lua: Fügen Sie eine:getPerimeter()-Methode hinzu, die den Umfang des Rechtecks mit der Formel 2 × (width + height) zurückgibt.Circle.lua: Fügen Sie eine:getPerimeter()-Methode hinzu, die den Umfang des Kreises mit der Formel 2 × π × radius zurückgibt. Verwenden Siemath.pifür π.main.lua: Binden Sie beide Shape-Module ein, lesen Sie die Dimensionen aus der Eingabe, erstellen Sie ein Rectangle und einen Circle und geben Sie dann sechs Zeilen aus: den Namen, die Fläche und den Umfang des Rechtecks, gefolgt vom Namen, der Fläche und dem Umfang des Kreises.
Beide Formen verfügen nun über eine vollständige Schnittstelle mit :getName(), :getArea() und :getPerimeter() – alle über dieselben Methodennamen zugänglich, trotz unterschiedlicher Implementierungen.
Eingabe: Drei Zeilen – width (Zahl), height (Zahl) und radius (Zahl).
Ausgabe: Sechs Zeilen in der Reihenfolge: Name des Rechtecks, Fläche des Rechtecks, Umfang des Rechtecks, Name des Kreises, Fläche des Kreises, Umfang des Kreises.
Probier es selbst
-- Erfordert das Rectangle-Modul
local Rectangle = require('Rectangle')
-- Erfordert das Circle-Modul
local Circle = require('Circle')
-- Breite und Höhe von der Eingabe lesen
local width = tonumber(io.read())
local height = tonumber(io.read())
local radius = tonumber(io.read())
-- Erstellt eine neue Rectangle-Instanz mit den angegebenen Dimensionen
local rect = Rectangle:new(width, height)
-- Erstellt eine neue Circle-Instanz mit dem angegebenen Radius
local circ = Circle:new(radius)
-- Gibt den Namen, die Fläche und den Umfang des Rechtecks aus
print(rect:getName())
print(rect:getArea())
print(rect:getPerimeter())
-- Gibt den Namen, die Fläche und den Umfang des Kreises aus
print(circ:getName())
print(circ:getArea())
print(circ:getPerimeter())
Alle Lektionen in Object Oriented Programming
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-Klasse2Klassen-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