Menu
Coddy logo textTech

Итоговая проверка ООП

Часть раздела Объектно-ориентированное программирование путешествия по Lua на Coddy. Урок 70 из 70.

challenge icon

Задание

Легко

Давайте объединим всё, что вы узнали об 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:

  1. Имя автомобиля
  2. Имя велосипеда
  3. Скорость, которую нужно установить для обоих транспортных средств (число)
  4. Количество топлива, которое нужно добавить в автомобиль (число)

В вашем основном файле:

  1. Создайте автомобиль и велосипед с given именами
  2. Установите скорость для обоих транспортных средств, используя третий input
  3. Заправьте автомобиль, используя четвёртый input
  4. Выведите description автомобиля
  5. Выведите 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: Вывести описание велосипеда

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Lua