Итоговая проверка ООП
Часть раздела Объектно-ориентированное программирование путешествия по Lua на Coddy. Урок 70 из 70.
Задание
ЛегкоДавайте объединим всё, что вы узнали об OOP в Lua! Вы создадите систему транспортных средств, демонстрирующую наследование, инкапсуляцию с помощью соглашений об именовании и mixin для дополнительных возможностей.
Вы организуете код в пяти файлах:
Vehicle.lua: базовый class для всех транспортных средств. У каждого транспортного средства естьnameи_speed, оформленный согласно private convention (инициализируется значением 0). Добавьте getter:getName(), getter:getSpeed()и setter:setSpeed(value), который отклоняет отрицательные значения (если значение отрицательное, выведитеSpeed cannot be negativeи не изменяйте значение). Добавьте method:describe(), который возвращает"{name} moving at {speed}".Refuelable.lua: таблица mixin, содержащая поведение, связанное с топливом. Добавьте method:refuel(amount), который прибавляет значение кself._fuel, и method:getFuel(), который возвращает текущий уровень топлива.Car.lua: Inherits от Vehicle и использует mixin Refuelable. constructor принимаетnameи инициализирует_fuelзначением 0. Переопределите:describe(), чтобы он возвращал"{name} moving at {speed}, fuel: {fuel}". Apply mixin Refuelable, чтобы наделить автомобили возможностями работы с топливом.Bicycle.lua: Inherits только от Vehicle: функциональность топлива не требуется. constructor принимает толькоname. Велосипеды используют inherited:describe()method без modification.main.lua: Объедините всё вместе! Создайте автомобиль и велосипед на основе inputs, продемонстрируйте их различные возможности и покажите, как они используют общее поведение транспортных средств, имея при этом отличающиеся функции.
Вы получите четыре inputs:
- Имя автомобиля
- Имя велосипеда
- Скорость, которую нужно установить для обоих транспортных средств (число)
- Количество топлива, которое нужно добавить в автомобиль (число)
В вашем основном файле:
- Создайте автомобиль и велосипед с given именами
- Установите скорость для обоих транспортных средств, используя третий input
- Заправьте автомобиль, используя четвёртый input
- Выведите description автомобиля
- Выведите description велосипеда
Например, если inputs — это Sedan, Mountain Bike, 60 и 45, результат должен быть таким:
Sedan moving at 60, fuel: 45
Mountain Bike moving at 60Если inputs — это Sports Car, Road Bike, 120 и 80, результат должен быть таким:
Sports Car moving at 120, fuel: 80
Road Bike moving at 120Этот challenge демонстрирует, как наследование обеспечивает общее поведение (both транспортных средства могут двигаться), mixin добавляют дополнительные возможности (топливо нужно только автомобилям), а инкапсуляция защищает целостность данных (проверка скорости). Каждый подход служит своей цели в вашей разработке!
Попробуйте сами
-- 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: Вывести описание велосипеда
Все уроки раздела Объектно-ориентированное программирование
1Концепция 'self'
Таблицы с функциямиЯвный 'self'Синтаксис с двоеточиемТочка против двоеточияИтоги — Движущаяся точка4Проект: Цифровой банк
Настройка проектаМетод пополнения7Полиморфизм и переопределение
Переопределение методовВызов родительских методовУтиная типизацияОбщий интерфейсПроверка типаИтоги — Роли сотрудников2Паттерн прототипа класса
Концепция прототипаСвязывание через __indexКонструктор :new()Инициализация атрибутовНезависимые экземплярыИтоги — Автозавод5Перегрузка операторов в ООП
Сложение объектовВычитание объектовКонкатенация объектовСравнение объектов (<, >)Повторение — Математика кошелька8Инкапсуляция
Соглашения об именованииЗамыкания для приватностиДоступ через замыканияТаблицы только для чтенияЛогика валидацииИтоги — Защищенное хранилище11Паттерны проектирования (Lite)
Фабричные функцииТаблица SingletonПаттерн IteratorObserver (Слушатель)Итоги — Logger Factory3Состояние и поведение объектов
Переменные экземпляраГеттерыСеттерыВычисляемые свойстваФорматирование строкПроверка на равенствоПовторение — Оценка студента6Основы наследования
Настройка наследованияНаследование методовРасширение конструктораДобавление дочерних методовОбщее и уникальноеИтоги: Иерархия фигур9Композиция и примеси
Отношение "Has-A"ДелегированиеПростые примесиПрименение нескольких примесейПримеси против наследованияИтоги — Сборка робота12Финальные испытания
Повторение: Система инвентаряПовторение: Менеджер пользователейПовторение: Трекер счетаИтоговая проверка ООППотренируйтесь самостоятельно: Онлайн-компилятор Lua