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