Итоговая проверка ООП
Часть раздела Object Oriented Programming путешествия по Lua на Coddy — урок 70 из 70.
Задание
ЛегкоДавайте объединим все, что вы узнали об ООП в Lua! Вы создадите систему транспортных средств, которая демонстрирует наследование, инкапсуляцию через соглашения об именовании и примеси (mixins) для дополнительных возможностей.
Вы организуете свой код в пяти файлах:
Vehicle.lua: Базовый класс для всех транспортных средств. Каждое транспортное средство имеетnameи_speed(инициализируется значением 0), соответствующее соглашению о приватности. Включите геттер:getName(), геттер:getSpeed()и сеттер:setSpeed(value), который отклоняет отрицательные значения (если значение отрицательное, выведитеSpeed cannot be negativeи не изменяйте значение). Добавьте метод:describe(), который возвращает"{name} moving at {speed}".Refuelable.lua: Таблица-примесь, содержащая поведение, связанное с топливом. Включите метод:refuel(amount), который прибавляет значение кself._fuel, и метод:getFuel(), который возвращает текущий уровень топлива.Car.lua: Наследуется от Vehicle и использует примесь Refuelable. Конструктор принимаетnameи инициализирует_fuelзначением 0. Переопределите:describe(), чтобы он возвращал"{name} moving at {speed}, fuel: {fuel}". Примените примесь Refuelable, чтобы наделить автомобили возможностью заправки.Bicycle.lua: Наследуется только от Vehicle — функциональность топлива не требуется. Конструктор принимает толькоname. Велосипеды используют унаследованный метод:describe()без изменений.main.lua: Объедините все вместе! Создайте автомобиль и велосипед на основе входных данных, продемонстрируйте их различные возможности и покажите, как они разделяют общее поведение транспортных средств, обладая при этом уникальными особенностями.
Вы получите четыре входных значения:
- Название автомобиля
- Название велосипеда
- Скорость, которую нужно установить для обоих транспортных средств (число)
- Количество топлива для заправки автомобиля (число)
В вашем основном файле (main.lua):
- Создайте автомобиль и велосипед с заданными именами
- Установите скорость для обоих транспортных средств, используя третье входное значение
- Заправьте автомобиль, используя четвертое входное значение
- Выведите описание автомобиля
- Выведите описание велосипеда
Например, если входные данные — Sedan, Mountain Bike, 60 и 45, вывод должен быть следующим:
Sedan moving at 60, fuel: 45
Mountain Bike moving at 60Если входные данные — Sports Car, Road Bike, 120 и 80, вывод должен быть следующим:
Sports Car moving at 120, fuel: 80
Road Bike moving at 120Эта задача демонстрирует, как наследование обеспечивает общее поведение (оба транспортных средства могут двигаться), примеси добавляют опциональные возможности (только автомобилям нужно топливо), а инкапсуляция защищает целостность данных (валидация скорости). Каждая техника служит своей цели в вашем проектировании!
Попробуйте сами
-- main.lua: Собираем всё вместе
local Car = require('Car')
local Bicycle = require('Bicycle')
-- Чтение входных данных
local carName = io.read()
local bicycleName = io.read()
local speed = tonumber(io.read())
local fuelAmount = tonumber(io.read())
-- TODO: Создать автомобиль с заданным именем
-- TODO: Создать велосипед с заданным именем
-- TODO: Установить скорость для обоих транспортных средств
-- TODO: Заправить автомобиль указанным количеством топлива
-- TODO: Вывести описание автомобиля
-- TODO: Вывести описание велосипеда
Все уроки раздела Object Oriented Programming
1Концепция 'self'
Таблицы с функциямиЯвный 'self'Синтаксис с двоеточиемТочка против двоеточияИтоги — Движущаяся точка4Проект: Цифровой банк
Настройка проектаМетод пополнения7Полиморфизм и переопределение
Переопределение методовВызов родительских методовУтиная типизацияОбщий интерфейсПроверка типаИтоги — Роли сотрудников2Паттерн прототипа класса
Концепция прототипаСвязывание через __indexКонструктор :new()Инициализация атрибутовНезависимые экземплярыИтоги — Автозавод5Перегрузка операторов в ООП
Сложение объектовВычитание объектовКонкатенация объектовСравнение объектов (<, >)Повторение — Математика кошелька8Инкапсуляция
Соглашения об именованииЗамыкания для приватностиДоступ через замыканияТаблицы только для чтенияЛогика валидацииИтоги — Защищенное хранилище11Паттерны проектирования (Lite)
Фабричные функцииТаблица SingletonПаттерн IteratorObserver (Слушатель)Итоги — Logger Factory3Состояние и поведение объектов
Переменные экземпляраГеттерыСеттерыВычисляемые свойстваФорматирование строкПроверка на равенствоПовторение — Оценка студента6Основы наследования
Настройка наследованияНаследование методовРасширение конструктораДобавление дочерних методовОбщее и уникальноеИтоги: Иерархия фигур9Композиция и примеси
Отношение "Has-A"ДелегированиеПростые примесиПрименение нескольких примесейПримеси против наследованияИтоги — Сборка робота12Финальные испытания
Повторение: Система инвентаряПовторение: Менеджер пользователейПовторение: Трекер счетаИтоговая проверка ООП