Menu
Coddy logo textTech

Kolekcja kształtów

Część sekcji Programowanie obiektowe ścieżki Lua w Coddy. Lekcja 59 z 70.

challenge icon

Wyzwanie

Łatwy

Teraz, gdy masz już w pełni funkcjonalne klasy Rectangle i Circle, utwórzmy klasę ShapeCollection, która może zarządzać wieloma kształtami jednocześnie. To świetny przykład kompozycji: kolekcja „ma” kształty, zamiast „być” kształtem.

Dodasz nowy plik do swojego rozbudowującego się projektu:

  • Shape.lua: Twoja bazowa klasa Shape (bez zmian).
  • Rectangle.lua: Twoja klasa Rectangle z metodami :getArea() i :getPerimeter().
  • Circle.lua: Twoja klasa Circle z metodami :getArea() i :getPerimeter().
  • ShapeCollection.lua: Utwórz nową klasę, która przechowuje kształty wewnętrznie. Dodaj konstruktor :new(), który inicjalizuje pustą listę kształtów, metodę :addShape(shape), która dodaje dowolny kształt do kolekcji, oraz metodę :count(), która zwraca liczbę aktualnie przechowywanych kształtów.
  • main.lua: Połącz wszystko, importując swoje moduły. Odczytaj wymiary z danych wejściowych, utwórz prostokąt i koło, dodaj oba do ShapeCollection, a następnie wypisz liczbę elementów kolekcji, a po niej nazwę każdego kształtu (w kolejności, w jakiej zostały dodane).

ShapeCollection nie musi wiedzieć, czy przechowuje prostokąty, czy koła. Po prostu przechowuje kształty. To pokazuje, jak polimorfizm pozwala jednolicie traktować różne typy obiektów za pomocą wspólnego interfejsu.

Dane wejściowe: Trzy wiersze: szerokość (liczba), wysokość (liczba) i promień (liczba).

Dane wyjściowe: Trzy wiersze: liczba kształtów w kolekcji, następnie nazwa pierwszego dodanego kształtu, a potem nazwa drugiego dodanego kształtu.

Spróbuj swoich sił

-- Załaduj moduł Rectangle
local Rectangle = require('Rectangle')

-- Załaduj moduł Circle
local Circle = require('Circle')

-- Załaduj moduł ShapeCollection
local ShapeCollection = require('ShapeCollection')

-- Odczytaj szerokość i wysokość z wejścia
local width = tonumber(io.read())
local height = tonumber(io.read())
local radius = tonumber(io.read())

-- Utwórz nową instancję Rectangle o podanych wymiarach
local rect = Rectangle:new(width, height)

-- Utwórz nową instancję Circle o podanym promieniu
local circ = Circle:new(radius)

-- Utwórz nową instancję ShapeCollection
local collection = ShapeCollection:new()

-- Dodaj obie figury do kolekcji
collection:addShape(rect)
collection:addShape(circ)

-- Wypisz liczbę figur w kolekcji
print(collection:count())

-- Wypisz nazwę każdej figury w kolejności ich dodawania
for i = 1, collection:count() do
    print(collection.shapes[i]:getName())
end

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Lua online