Wypożyczalnia pojazdów
Część sekcji Programowanie obiektowe ścieżki GDScript w Coddy. Lekcja 65 z 65.
Wyzwanie
ŚredniZbuduj system wypożyczania pojazdów: pojazdy dwóch rodzajów, wypożyczenia oraz agencję, która zarządza nimi wszystkimi. Ceny są podawane w pełnych dolarach (int).
Vehicle w pliku vehicle.gd:
- Konstruktor przyjmuje
vin,make,modelidaily_rate;availablepoczątkowo ma wartośćtrue. start_rental() -> bool: zwracafalse, gdy pojazd jest niedostępny; w przeciwnym razie oznacza go jako niedostępny i zwracatrue.end_rental()ponownie ustawia go jako dostępny._to_string()zwracaMAKE MODEL (VIN: VIN) - Availablealbo- Rentedna końcu.
Car w pliku car.gd i Motorcycle w pliku motorcycle.gd dziedziczą po Vehicle. Ich konstruktory przyjmują cztery wartości pojazdu oraz seats (samochód) lub engine_size (motocykl). Ich _to_string() rozszerza tekst klasy nadrzędnej: Car: + tekst pojazdu + - 5 seats oraz Motorcycle: + tekst pojazdu + - 600cc.
Rental w pliku rental.gd:
- Konstruktor przyjmuje
rental_id, obiektvehicle,customer_nameidays;is_activepoczątkowo ma wartośćtrue. calculate_cost() -> int: stawka dzienna pomnożona przez liczbę dni.end_rental() -> bool: zwracafalsedla wypożyczenia, które już się zakończyło; w przeciwnym razie kończy je, kończy wypożyczenie pojazdu i zwracatrue._to_string():Rental ID: MAKE MODEL for CUSTOMER, D days, $COST - Activealbo- Completed.
RentalAgency w pliku rental_agency.gd:
- Konstruktor przyjmuje
agency_name.vehiclesto słownik mapujący VIN na pojazd,rentalsto słownik mapujący identyfikator wypożyczenia na wypożyczenie, anext_rental_idpoczątkowo ma wartość1. add_vehicle(vehicle)zapisuje pojazd pod jego VIN-em.rent_vehicle(vin, customer_name, days) -> String: zwraca""dla nieznanego VIN-u, liczby dni mniejszej niż1lub niedostępnego pojazdu. W przeciwnym razie rozpoczyna wypożyczenie pojazdu, tworzy obiektRentalz identyfikatoremR1,R2... (licznik zwiększa się tylko w przypadku udanego wypożyczenia), zapisuje go i zwraca identyfikator.return_vehicle(rental_id) -> bool: zwracafalsedla nieznanego identyfikatora; w przeciwnym razie zwraca wynikend_rental()wywołanego na wypożyczeniu.available_vehicles() -> Array[Vehicle]: dostępne pojazdy w kolejności, w jakiej zostały dodane.total_revenue() -> int: suma kosztów wszystkich wypożyczeń, aktywnych lub zakończonych.
Wypożyczenie przechowuje swój pojazd, ale pojazd nie przechowuje wypożyczenia, więc żadne dwa obiekty nie wskazują na siebie nawzajem. Dla tego wejścia:
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
revenuewynik to:
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: $150Umieść swój kod w plikach vehicle.gd, car.gd, motorcycle.gd, rental.gd i rental_agency.gd. Plik main.gd zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
extends Node
func _ready():
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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()
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe selfMetodyWłaściwościKonstruktor (_init)Powtórka – prosty kalkulator4Polimorfizm
Ponowne omówienie przesłaniania metodDuck typingKlasy i metody abstrakcyjneProjektowanie interfejsówPowtórzenie – kalkulator kształtów7Sygnały
Czym jest sygnał?Deklarowanie i emitowanieŁączenie z sygnałamiSygnały z argumentamiPodsumowanie — system zdrowia10Wzorce projektowe, część 2
Wzorzec poleceniaWzorzec adapteraWzorzec dekoratoraWzorzec metody szablonowejWzorzec stanuWzorzec kompozytu2Właściwości klas
Zmienne instancji a zmienne statyczneFunkcje statyczneSettery właściwościGettery właściwościPrywatne z konwencjiPodsumowanie — menedżer kont bankowych5Enkapsulacja
Elementy publiczne i prywatneWalidacja za pomocą setterówUkrywanie informacjiWłaściwości tylko do odczytuPodsumowanie – system ewidencji uczniów8Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieKlasy wewnętrzneWęzły jako komponentyRefCounted a NodeTypy wyliczeniowe w klasach11Projekt: Zarządzanie biblioteką
Przegląd projektuKlasy książki i użytkownika3Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe superNadpisywanie metodŁańcuchy dziedziczeniaSprawdzanie typów za pomocą isPodsumowanie – hierarchia pracowników6Metody specjalne
Wprowadzenie do metod wirtualnychMetoda _to_stringWłasne iteratoryPodsumowanie — własna lista9Wzorce projektowe — część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec Strategy12Wyzwania końcowe
Platforma e-learningowaSystem bankowyTworzenie postaci do gryWypożyczalnia pojazdówPoćwicz samodzielnie: Kompilator GDScript online