Коллекция фигур
Часть раздела Объектно-ориентированное программирование путешествия по Lua на Coddy. Урок 59 из 70.
Задание
ЛегкоТеперь, когда у тебя есть классы 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
Все уроки раздела Объектно-ориентированное программирование
1Концепция 'self'
Таблицы с функциямиЯвный 'self'Синтаксис с двоеточиемТочка против двоеточияИтоги — Движущаяся точка4Проект: Цифровой банк
Настройка проектаМетод пополнения7Полиморфизм и переопределение
Переопределение методовВызов родительских методовУтиная типизацияОбщий интерфейсПроверка типаИтоги — Роли сотрудников10Проект: Менеджер фигур
Настройка проектаКласс RectangleКласс CircleМетод PerimeterКоллекция фигурОбщая площадьФильтрация фигур2Паттерн прототипа класса
Концепция прототипаСвязывание через __indexКонструктор :new()Инициализация атрибутовНезависимые экземплярыИтоги — Автозавод5Перегрузка операторов в ООП
Сложение объектовВычитание объектовКонкатенация объектовСравнение объектов (<, >)Повторение — Математика кошелька8Инкапсуляция
Соглашения об именованииЗамыкания для приватностиДоступ через замыканияТаблицы только для чтенияЛогика валидацииИтоги — Защищенное хранилище11Паттерны проектирования (Lite)
Фабричные функцииТаблица SingletonПаттерн IteratorObserver (Слушатель)Итоги — Logger Factory3Состояние и поведение объектов
Переменные экземпляраГеттерыСеттерыВычисляемые свойстваФорматирование строкПроверка на равенствоПовторение — Оценка студента6Основы наследования
Настройка наследованияНаследование методовРасширение конструктораДобавление дочерних методовОбщее и уникальноеИтоги: Иерархия фигурПотренируйтесь самостоятельно: Онлайн-компилятор Lua