Menu
Coddy logo textTech

Коллекция фигур

Часть раздела Object Oriented Programming путешествия по Lua на Coddy — урок 59 из 70.

challenge icon

Задание

Легко

Теперь, когда у вас есть классы Rectangle и Circle с полной функциональностью, давайте создадим класс ShapeCollection, который сможет управлять несколькими фигурами вместе. Это отличный пример композиции — коллекция «содержит» фигуры, а не «является» фигурой.

Вы добавите новый файл в свой растущий проект:

  • Shape.lua: Ваш базовый класс Shape (без изменений).
  • Rectangle.lua: Ваш класс Rectangle с методами :getArea() и :getPerimeter().
  • Circle.lua: Ваш класс Circle с методами :getArea() и :getPerimeter().
  • ShapeCollection.lua: Создайте новый класс, который хранит фигуры внутри себя. Включите конструктор :new(), который инициализирует пустой список фигур, метод :addShape(shape), который добавляет любую фигуру в коллекцию, и метод :count(), который возвращает количество хранящихся в данный момент фигур.
  • main.lua: Объедините все вместе, подключив ваши модули. Считайте размеры из входных данных, создайте Rectangle и Circle, добавьте оба объекта в ShapeCollection, затем выведите количество фигур в коллекции, а после — имя каждой фигуры (в том порядке, в котором они были добавлены).

Классу ShapeCollection не нужно знать, хранит ли он прямоугольники или круги — он просто содержит фигуры. Это демонстрирует, как полиморфизм позволяет единообразно обрабатывать различные типы объектов через общий интерфейс.

Ввод: Три строки — ширина (число), высота (число) и радиус (число).

Вывод: Три строки — количество фигур в коллекции, затем имя первой добавленной фигуры, затем имя второй добавленной фигуры.

Попробуйте сами

-- Подключить модуль Rectangle
local Rectangle = require('Rectangle')

-- Подключить модуль Circle
local Circle = require('Circle')

-- Подключить модуль ShapeCollection
local ShapeCollection = require('ShapeCollection')

-- Прочитать ширину и высоту из ввода
local width = tonumber(io.read())
local height = tonumber(io.read())
local radius = tonumber(io.read())

-- Создать новый экземпляр Rectangle с заданными размерами
local rect = Rectangle:new(width, height)

-- Создать новый экземпляр Circle с заданным радиусом
local circ = Circle:new(radius)

-- Создать новую коллекцию ShapeCollection
local collection = ShapeCollection:new()

-- Добавить обе фигуры в коллекцию
collection:addShape(rect)
collection:addShape(circ)

-- Вывести количество фигур в коллекции
print(collection:count())

-- Вывести имя каждой фигуры в порядке их добавления
for i = 1, collection:count() do
    print(collection.shapes[i]:getName())
end

Все уроки раздела Object Oriented Programming