Menu
Coddy logo textTech

Formen-Sammlung

Teil des Abschnitts Objektorientierte Programmierung der Lua-Journey von Coddy. Lektion 59 von 70.

challenge icon

Aufgabe

Einfach

Da du nun sowohl über Klassen für Rechtecke als auch für Kreise mit vollständiger Funktionalität verfügst, erstellen wir eine ShapeCollection-Klasse, die mehrere Formen gemeinsam verwalten kann. Dies ist ein großartiges Beispiel für Komposition: Die Sammlung „hat“ Formen, anstatt selbst eine Form „zu sein“.

Du fügst deinem wachsenden Projekt eine neue Datei hinzu:

  • Shape.lua: Deine grundlegende Shape-Klasse (unverändert).
  • Rectangle.lua: Deine Rectangle-Klasse mit :getArea() und :getPerimeter().
  • Circle.lua: Deine Circle-Klasse mit :getArea() und :getPerimeter().
  • ShapeCollection.lua: Erstelle eine neue Klasse, die Formen intern speichert. Füge einen :new()-Konstruktor hinzu, der eine leere Liste von Formen initialisiert, eine :addShape(shape)-Methode, die eine beliebige Form zur Sammlung hinzufügt, und eine :count()-Methode, die zurückgibt, wie viele Formen derzeit gespeichert sind.
  • main.lua: Führe alles zusammen, indem du deine Module einbindest. Lies die Abmessungen aus der Eingabe, erstelle ein Rectangle und einen Circle, füge beide zu einer ShapeCollection hinzu und gib anschließend die Anzahl der Formen in der Sammlung gefolgt vom Namen jeder Form aus (in der Reihenfolge, in der sie hinzugefügt wurden).

Die ShapeCollection muss nicht wissen, ob sie Rechtecke oder Kreise speichert. Sie enthält einfach Formen. Dies zeigt, wie du dank Polymorphie verschiedene Objekttypen über eine gemeinsame Schnittstelle einheitlich behandeln kannst.

Eingabe: Drei Zeilen: Breite (Zahl), Höhe (Zahl) und Radius (Zahl).

Ausgabe: Drei Zeilen: die Anzahl der Formen in der Sammlung, anschließend der Name der zuerst hinzugefügten Form und danach der Name der als Zweites hinzugefügten Form.

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 Dimensionen 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 Anzahl der Formen in der Sammlung ausgeben
print(collection:count())

-- Den Namen jeder Form in der Reihenfolge ausgeben, in der sie hinzugefügt wurden
for i = 1, collection:count() do
    print(collection.shapes[i]:getName())
end

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Lua-Compiler