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