Menu
Coddy logo textTech

Pole całkowite

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

challenge icon

Wyzwanie

Łatwy

Dodajmy do Twojego ShapeCollection przydatną funkcję: możliwość obliczania łącznego pola wszystkich zawartych w nim figur. Właśnie tutaj polimorfizm pokazuje swoją siłę: Twoja kolekcja może wywołać :getArea() na dowolnej figurze, nie wiedząc, czy jest to prostokąt, czy koło.

Kontynuujesz pracę nad istniejącymi plikami projektu:

  • Shape.lua: Twoja podstawowa 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: Rozszerz swoją klasę kolekcji, dodając metodę :getTotalArea(). Metoda ta powinna przejść przez wszystkie przechowywane figury, wywołać na każdej z nich :getArea() i zwrócić sumę wszystkich pól.
  • main.lua: Wczytaj swoje moduły, odczytaj wymiary z danych wejściowych, utwórz prostokąt i koło, dodaj obie figury do ShapeCollection, a następnie wypisz łączne pole wszystkich figur w kolekcji.

Zaletą tego podejścia jest to, że :getTotalArea() nie potrzebuje osobnej logiki dla prostokątów i kół. Po prostu zakłada, że każda figura w kolekcji ma metodę :getArea(). Później możesz dodać trójkąty, sześciokąty lub dowolne inne figury, a obliczanie łącznego pola będzie działać bez zmian.

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

Wynik: Jeden wiersz zawierający łączne pole wszystkich figur w kolekcji.

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 danych wejściowych
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)

-- Wyświetl łączne pole wszystkich figur w kolekcji
print(collection:getTotalArea())

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Lua online