Сервис аренды автомобилей
Часть раздела Объектно-ориентированное программирование путешествия по GDScript на Coddy. Урок 65 из 65.
Задание
СреднеСоздай сервис проката транспортных средств: транспортные средства двух видов, аренда и агентство, которое управляет и тем и другим. Цены указаны в целых долларах (int).
Vehicle в vehicle.gd:
- Конструктор принимает
vin,make,modelиdaily_rate; изначальноavailableимеет значениеtrue. start_rental() -> bool: возвращаетfalse, если транспортное средство недоступно; в противном случае помечает его как недоступное и возвращаетtrue.end_rental()снова делает его доступным._to_string()возвращаетMAKE MODEL (VIN: VIN) - Availableили заканчивается на- Rented.
Car в car.gd и Motorcycle в motorcycle.gd наследуются от Vehicle. Их конструкторы принимают четыре значения транспортного средства, а также seats (для автомобиля) или engine_size (для мотоцикла). Их _to_string() дополняет текст родительского класса: Car: + текст транспортного средства + - 5 seats, а также Motorcycle: + текст транспортного средства + - 600cc.
Rental в rental.gd:
- Конструктор принимает
rental_id, объектvehicle,customer_nameиdays; изначальноis_activeимеет значениеtrue. calculate_cost() -> int: дневная ставка, умноженная на количество дней.end_rental() -> bool: возвращаетfalseдля аренды, которая уже завершилась; в противном случае завершает её, завершает аренду транспортного средства и возвращаетtrue._to_string():Rental ID: MAKE MODEL for CUSTOMER, D days, $COST - Activeили- Completed.
RentalAgency в rental_agency.gd:
- Конструктор принимает
agency_name.vehicles— это словарь, сопоставляющий VIN транспортному средству,rentals— словарь, сопоставляющий идентификатор аренды аренде, а начальное значениеnext_rental_id—1. add_vehicle(vehicle)сохраняет транспортное средство под его VIN.rent_vehicle(vin, customer_name, days) -> String: возвращает"", если VIN неизвестен, количество дней меньше1или транспортное средство недоступно. В противном случае начинает аренду транспортного средства, создаёт объектRentalс идентификаторомR1,R2... (счётчик увеличивается только при успешной аренде), сохраняет его и возвращает идентификатор.return_vehicle(rental_id) -> bool: возвращаетfalseдля неизвестного идентификатора; в противном случае возвращает результат вызоваend_rental()аренды.available_vehicles() -> Array[Vehicle]: доступные транспортные средства в порядке их добавления.total_revenue() -> int: сумма стоимости всех аренд, активных или завершённых.
Аренда хранит ссылку на транспортное средство, но транспортное средство не хранит ссылку на аренду, поэтому объекты не ссылаются друг на друга. Для этого ввода:
Speedy Rentals
car C1|Toyota|Camry|50|5
moto M1|Honda|CBR|40|600
rent C1|Ana|3
rent C1|Ben|2
available
kind M1
rentals
revenueрезультат будет таким:
Rented C1 as R1: $150
Cannot rent C1
Available at Speedy Rentals:
- Motorcycle: Honda CBR (VIN: M1) - Available - 600cc
M1: Vehicle true, Car false, Motorcycle true
Rental R1: Toyota Camry for Ana, 3 days, $150 - Active
Revenue: $150Твой код нужно поместить в vehicle.gd, car.gd, motorcycle.gd, rental.gd и rental_agency.gd. В main.gd содержится предоставленный код ввода/вывода, который нельзя редактировать.
Попробуйте сами
extends Node
func _ready():
# Предоставленный код ввода-вывода: оставьте его без изменений
var agency := RentalAgency.new(OS.read_string_from_stdin())
var line := OS.read_string_from_stdin()
while line != "":
var parts := line.split(" ", true, 1)
var f: PackedStringArray = parts[1].split("|") if parts.size() > 1 else PackedStringArray()
match parts[0]:
"vehicle":
agency.add_vehicle(Vehicle.new(f[0], f[1], f[2], int(f[3])))
"car":
agency.add_vehicle(Car.new(f[0], f[1], f[2], int(f[3]), int(f[4])))
"moto":
agency.add_vehicle(Motorcycle.new(f[0], f[1], f[2], int(f[3]), int(f[4])))
"rent":
var rental_id: String = agency.rent_vehicle(f[0], f[1], int(f[2]))
if rental_id == "":
print("Cannot rent ", f[0])
else:
var rental: Rental = agency.rentals[rental_id]
print("Rented %s as %s: $%d" % [f[0], rental_id, rental.calculate_cost()])
"return":
print("Return ", f[0], ": ", agency.return_vehicle(f[0]))
"available":
print("Available at ", agency.agency_name, ":")
for vehicle in agency.available_vehicles():
print("- ", vehicle)
"fleet":
for vin in agency.vehicles:
print(agency.vehicles[vin])
"kind":
var vehicle: Vehicle = agency.vehicles[f[0]]
print("%s: Vehicle %s, Car %s, Motorcycle %s" % [f[0], vehicle is Vehicle, vehicle is Car, vehicle is Motorcycle])
"rentals":
for rental_id in agency.rentals:
print(agency.rentals[rental_id])
"revenue":
print("Revenue: $", agency.total_revenue())
line = OS.read_string_from_stdin()
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово selfМетодыСвойстваКонструктор (_init)Повторение: простой калькулятор4Полиморфизм
Переопределение методов: повторениеУтиная типизацияАбстрактные классы и методыПроектирование интерфейсовПовторение — калькулятор фигур7Сигналы
Что такое сигнал?Объявление и отправкаПодключение к сигналамСигналы с аргументамиПовторение — система здоровья10Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»2Свойства классов
Переменные экземпляра и классаСтатические функцииСеттеры свойствГеттеры свойствПриватность по соглашениюПовторение — менеджер банковского счёта5Инкапсуляция
Открытые и закрытые членыПроверка данных с помощью сеттеровСокрытие информацииСвойства только для чтенияПовторение — система учета студентов8Продвинутые концепции ООП
Композиция и наследованиеВнутренние классыУзлы как компонентыRefCounted и NodeПеречисления в классах11Проект: Управление библиотекой
Обзор проектаКлассы книг и пользователей3Наследование
Основы наследованияКлючевое слово superПереопределение методовЦепочки наследованияПроверка типов с помощью isПовторение — иерархия сотрудников6Специальные методы
Введение в виртуальные методыМетод _to_stringПользовательские итераторыПовторение: пользовательский список9Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн «Одиночка»Паттерн «Фабрика»Паттерн «Наблюдатель»Паттерн «Стратегия»12Итоговые задания
Платформа электронного обученияБанковская системаРазработка игрового персонажаСервис аренды автомобилейПотренируйтесь самостоятельно: Онлайн-компилятор GDScript