Menu
Coddy logo textTech

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

Часть раздела Объектно-ориентированное программирование путешествия по Lua на Coddy. Урок 59 из 70.

challenge icon

Задание

Легко

Теперь, когда у тебя есть классы Rectangle и Circle с полной функциональностью, давай создадим класс ShapeCollection, который сможет управлять несколькими shapes одновременно. Это отличный пример композиции: коллекция "has" shapes, а не "being" shape.

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

  • Shape.lua: твой базовый класс Shape (без изменений).
  • Rectangle.lua: твой класс Rectangle с методами :getArea() и :getPerimeter().
  • Circle.lua: твой класс Circle с методами :getArea() и :getPerimeter().
  • ShapeCollection.lua: создай новый класс, который хранит shapes внутри. Включи конструктор :new(), инициализирующий пустой список shapes, метод :addShape(shape), добавляющий any shape в коллекцию, и метод :count(), возвращающий, how many shapes currently stored.
  • main.lua: объедини всё, подключив свои модули. Прочитай dimensions из input, создай Rectangle и Circle, добавь both в ShapeCollection, затем выведи count коллекции, после чего имя каждого shape (в order, в котором they were added).

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

Ввод: Три строки: width (number), height (number) и radius (number).

Вывод: Три строки: count shapes в коллекции, затем имя первого добавленного shape, затем имя второго добавленного shape.

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

-- Подключить модуль 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

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Lua