Итоги: Иерархия фигур
Часть раздела Object Oriented Programming путешествия по Lua на Coddy — урок 36 из 70.
Задание
ЛегкоДавайте создадим полную иерархию фигур с нуля! Вы создадите родительский класс Shape, от которого будут наследоваться все фигуры, а затем создадите дочерние классы Circle и Square, каждый из которых будет иметь свои уникальные свойства, разделяя при этом общую функциональность.
Вы организуете свой код в четырех файлах:
Shape.lua: Ваш базовый класс, от которого будут наследоваться все фигуры. Он должен иметь конструктор:new(color), который сохраняет цвет фигуры, и метод:getColor(), который его возвращает. Это общее свойство означает, что каждая фигура — будь то круг или квадрат — будет иметь цвет.Circle.lua: Дочерний класс, наследуемый от Shape. Его конструктор:new(color, radius)должен вызывать родительский конструктор для установки цвета, а затем добавлять радиус как уникальный атрибут. Включите метод:describe(), который выводит информацию о круге.Square.lua: Еще один дочерний класс, наследуемый от Shape. Его конструктор:new(color, side)также должен вызывать родительский конструктор, а затем сохранять длину стороны. Включите метод:describe()также и для квадратов.main.lua: Объедините все вместе, создав экземпляры обеих фигур и продемонстрировав, что они правильно наследуются от Shape, сохраняя при этом свои уникальные свойства.
Вы получите два входных значения:
- Данные круга: цвет и радиус, разделенные запятой (например,
blue,5) - Данные квадрата: цвет и длина стороны, разделенные запятой (например,
red,4)
В вашем основном файле создайте Circle и Square с заданными значениями. Затем выведите следующее на отдельных строках:
- Вызовите
:describe()для круга - Вызовите
:describe()для квадрата - Выведите цвет круга, используя
:getColor() - Выведите цвет квадрата, используя
:getColor()
Метод :describe() для Circle должен выводить:
Circle with radius {radius}Метод :describe() для Square должен выводить:
Square with side {side}Например, если входные данные blue,5 и red,4, вывод должен быть следующим:
Circle with radius 5
Square with side 4
blue
redЭто демонстрирует полный паттерн наследования: обе фигуры наследуют :getColor() от Shape (они никогда не определяют его сами), в то время как каждая имеет свой уникальный атрибут и метод :describe()!
Попробуйте сами
-- main.lua: Собираем всё вместе
local Circle = require('Circle')
local Square = require('Square')
-- Чтение входных данных для круга (цвет, радиус)
local circleInput = io.read()
local circleColor, circleRadius = circleInput:match("([^,]+),([^,]+)")
circleRadius = tonumber(circleRadius)
-- Чтение входных данных для квадрата (цвет, сторона)
local squareInput = io.read()
local squareColor, squareSide = squareInput:match("([^,]+),([^,]+)")
squareSide = tonumber(squareSide)
-- TODO: Создать экземпляр Circle с заданным цветом и радиусом
-- TODO: Создать экземпляр Square с заданным цветом и стороной
-- TODO: Вызвать :describe() для круга
-- TODO: Вызвать :describe() для квадрата
-- TODO: Вывести цвет круга, используя :getColor()
-- TODO: Вывести цвет квадрата, используя :getColor()
Все уроки раздела Object Oriented Programming
1Концепция 'self'
Таблицы с функциямиЯвный 'self'Синтаксис с двоеточиемТочка против двоеточияИтоги — Движущаяся точка4Проект: Цифровой банк
Настройка проектаМетод пополнения7Полиморфизм и переопределение
Переопределение методовВызов родительских методовУтиная типизацияОбщий интерфейсПроверка типаИтоги — Роли сотрудников2Паттерн прототипа класса
Концепция прототипаСвязывание через __indexКонструктор :new()Инициализация атрибутовНезависимые экземплярыИтоги — Автозавод5Перегрузка операторов в ООП
Сложение объектовВычитание объектовКонкатенация объектовСравнение объектов (<, >)Повторение — Математика кошелька8Инкапсуляция
Соглашения об именованииЗамыкания для приватностиДоступ через замыканияТаблицы только для чтенияЛогика валидацииИтоги — Защищенное хранилище11Паттерны проектирования (Lite)
Фабричные функцииТаблица SingletonПаттерн IteratorObserver (Слушатель)Итоги — Logger Factory3Состояние и поведение объектов
Переменные экземпляраГеттерыСеттерыВычисляемые свойстваФорматирование строкПроверка на равенствоПовторение — Оценка студента6Основы наследования
Настройка наследованияНаследование методовРасширение конструктораДобавление дочерних методовОбщее и уникальноеИтоги: Иерархия фигур