Fahrzeugvermietung
Teil des Abschnitts Objektorientierte Programmierung der GDScript-Journey von Coddy. Lektion 65 von 65.
Aufgabe
MittelErstelle einen Fahrzeugvermietungsdienst: Fahrzeuge zweier Arten, Mietverträge und die Agentur, die beides verwaltet. Die Preise sind ganze Dollarbeträge (int).
Vehicle in vehicle.gd:
- Der Konstruktor nimmt
vin,make,modelunddaily_rateentgegen;availableist anfangstrue. start_rental() -> bool: gibtfalsezurück, wenn das Fahrzeug nicht verfügbar ist; andernfalls markiert es das Fahrzeug als nicht verfügbar und gibttruezurück.end_rental()macht es wieder verfügbar._to_string()gibtMAKE MODEL (VIN: VIN) - Availablezurück, oder am Ende- Rented.
Car in car.gd und Motorcycle in motorcycle.gd erweitern Vehicle. Ihre Konstruktoren nehmen die vier Fahrzeugwerte sowie seats (Auto) oder engine_size (Motorrad) entgegen. Ihr _to_string() baut auf dem Text der Elternklasse auf: Car: + Fahrzeugtext + - 5 seats und Motorcycle: + Fahrzeugtext + - 600cc.
Rental in rental.gd:
- Der Konstruktor nimmt
rental_id, dasvehicle-Objekt,customer_nameunddaysentgegen;is_activeist anfangstrue. calculate_cost() -> int: der Tagessatz multipliziert mit der Anzahl der Tage.end_rental() -> bool:falsefür einen Mietvertrag, der bereits beendet wurde; andernfalls beendet es den Mietvertrag, beendet die Vermietung des Fahrzeugs und gibttruezurück._to_string():Rental ID: MAKE MODEL for CUSTOMER, D days, $COST - Activeoder- Completed.
RentalAgency in rental_agency.gd:
- Der Konstruktor nimmt
agency_nameentgegen.vehiclesist ein Dictionary, das VINs Fahrzeugen zuordnet,rentalsein Dictionary, das Mietvertrags-IDs Mietverträgen zuordnet, undnext_rental_idbeginnt bei1. add_vehicle(vehicle)speichert ein Fahrzeug unter seiner VIN.rent_vehicle(vin, customer_name, days) -> String: gibt""zurück, wenn die VIN unbekannt ist, weniger als1Tag angegeben wurde oder das Fahrzeug nicht verfügbar ist. Andernfalls beginnt es die Vermietung des Fahrzeugs, erstellt einenRentalmit der IDR1,R2... (der Zähler wird nur bei einer erfolgreichen Vermietung erhöht), speichert ihn und gibt die ID zurück.return_vehicle(rental_id) -> bool:falsebei einer unbekannten ID; andernfalls gibt es den Rückgabewert vonend_rental()des Mietvertrags zurück.available_vehicles() -> Array[Vehicle]: die verfügbaren Fahrzeuge in der Reihenfolge, in der sie hinzugefügt wurden.total_revenue() -> int: die Summe der Kosten aller Mietverträge, aktiver und abgeschlossener.
Ein Mietvertrag speichert sein Fahrzeug, aber ein Fahrzeug speichert nicht seinen Mietvertrag, sodass keine zwei Objekte aufeinander verweisen. Bei dieser Eingabe:
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
revenuelautet die Ausgabe:
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: $150Dein Code gehört in vehicle.gd, car.gd, motorcycle.gd, rental.gd und rental_agency.gd. main.gd enthält den bereitgestellten Ein-/Ausgabecode und kann nicht bearbeitet werden.
Probier es selbst
extends Node
func _ready():
# Vorgegebener Eingabe-/Ausgabecode: unverändert lassen
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()
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDas Schlüsselwort selfMethodenEigenschaftenKonstruktor (_init)Wiederholung – Einfacher Taschenrechner4Polymorphie
Methodenüberschreibung erneut betrachtetDuck-TypisierungAbstrakte Klassen und MethodenSchnittstellendesignRückblick – Formrechner2Klassenattribute
Instanz- vs. statische VariablenStatische FunktionenProperty-SetterProperty-GetterPrivat nach KonventionWiederholung – Bankkontenverwaltung5Kapselung
Öffentliche und private MemberValidierung mit SetternInformationsverbergenSchreibgeschützte EigenschaftenRückblick – System zur Schülerverwaltung8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungInnere KlassenNodes als KomponentenRefCounted vs. NodeEnums in Klassen11Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Vererbung
Grundlegende VererbungDas Schlüsselwort superMethodenüberschreibungVererbungskettenTypprüfungen mit isWiederholung – Mitarbeiterhierarchie6Spezielle Methoden
Einführung in virtuelle MethodenDie _to_string-MethodeBenutzerdefinierte IteratorenRückblick – Benutzerdefinierte Liste9Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterBeobachter-MusterStrategie-Muster12Abschließende Herausforderungen
E-Learning-PlattformBankensystemEntwicklung von SpielfigurenFahrzeugvermietungÜbe selbstständig: Online-GDScript-Compiler