Fahrzeugvermietung
Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy — Lektion 110 von 110.
Aufgabe
EinfachHerzlichen Glückwunsch zum Erreichen der finalen Herausforderung des OOP-Kurses! Lassen Sie uns einen umfassenden Vehicle Rental Service (Fahrzeugvermietung) bauen, der alles vereint, was Sie gelernt haben – abstrakte Klassen, Vererbung, Kapselung, das State-Pattern, das Factory-Pattern und Generics.
Ihr Vermietungsservice wird verschiedene Fahrzeugtypen verwalten, deren Verfügbarkeitsstatus verfolgen, Vermietungen abwickeln und Kundendatensätze führen. Sie werden dies über sieben Dateien hinweg organisieren:
vehicle_state.dart: Erstellen Sie eine abstrakte KlasseVehicleState, die definiert, wie sich Fahrzeuge in verschiedenen Zuständen verhalten. Fügen Sie eine abstrakte MethodeString getStatus()undbool canRent()hinzu. Erstellen Sie dann drei konkrete Zustände:AvailableState– gibtAvailablezurück und erlaubt die VermietungRentedState– gibtRentedzurück und erlaubt keine VermietungMaintenanceState– gibtIn Maintenancezurück und erlaubt keine Vermietung
vehicle.dart: Erstellen Sie eine abstrakte KlasseVehiclemit einerfinalid (String), einemfinalmodel (String), einer privaten_dailyRate(double) mit einem Getter und einem privaten_state(VehicleState), der mitAvailableStateinitialisiert wird. Fügen Sie hinzu:- Einen Getter
status, der den Status des Zustands zurückgibt bool isAvailable()– prüft, ob der aktuelle Zustand eine Vermietung zulässtvoid setState(VehicleState state)– ändert den Zustand des Fahrzeugs- Eine abstrakte Methode
double calculateRentalCost(int days) - Eine abstrakte Methode
String getRequirements()– gibt alle speziellen Anforderungen zurück
toString(), um[Type] model (id) - statuszurückzugeben, wobei Type der Laufzeittyp ist.- Einen Getter
vehicles.dart: Erstellen Sie drei Fahrzeugtypen, dieVehicleerweitern:Car– Standard-Mietkosten sind Tagesrate mal Tage. Anforderungen:Valid driver's licenseMotorcycle– Mietkosten sind Tagesrate mal Tage mit 10 % Rabatt. Anforderungen:Motorcycle license, Age 21+Truck– Mietkosten sind Tagesrate mal Tage plus eine Pauschalgebühr von $50. Anforderungen:Commercial license, Deposit required
vehicle_factory.dart: Erstellen Sie eine KlasseVehicleFactorymit einer statischen MethodeVehicle create(String type, String id, String model, double dailyRate), die das entsprechende Fahrzeug basierend auf dem Typ (car,motorcycleodertruck) zurückgibt. Erstellen Sie bei unbekannten Typen standardmäßig ein Car.customer.dart: Erstellen Sie eine KlasseCustomermit einer id (String), einem name (String) und einer privaten Liste von Mietdatensätzen (Liste von Strings). Fügen Sie hinzu:addRental(String vehicleInfo)– fügt einen Mietdatensatz hinzugetRentalCount()– gibt die Anzahl der Vermietungen zurückbool isEligible()– gibt true zurück, wenn der Kunde weniger als 3 aktive Vermietungen hat
toString(), umCustomer: name (id) - X rentalszurückzugeben.rental_service.dart: Erstellen Sie eine KlasseRentalServiceunter Verwendung von Generics mit einerList<Vehicle>für die Flotte und einerList<Customer>für Kunden. Fügen Sie hinzu:addVehicle(Vehicle vehicle)– fügt zur Flotte hinzu, gibtAdded: vehicle.toString()ausregisterCustomer(Customer customer)– registriert den KundenrentVehicle(String customerId, String vehicleId, int days)– wenn der Kunde existiert, berechtigt ist und das Fahrzeug verfügbar ist: ändert den Fahrzeugzustand auf Rented, fügt die Vermietung dem Kunden hinzu, gibtcustomerId rented vehicleId for X days. Cost: $Yaus (Y auf 2 Dezimalstellen formatiert). Geben Sie andernfalls eine entsprechende Nachricht aus:Customer not found,Customer not eligible,Vehicle not foundoderVehicle not availablereturnVehicle(String vehicleId)– setzt den Fahrzeugzustand auf Available, gibtvehicleId returnedaussendToMaintenance(String vehicleId)– setzt den Fahrzeugzustand auf Maintenance, gibtvehicleId sent to maintenanceausgetAvailableVehicles()– gibt eine Liste der verfügbaren Fahrzeuge zurück
main.dart: Demonstrieren Sie Ihren Vermietungsservice. Erstellen Sie einenRentalServiceund nutzen Sie die Factory, um drei Fahrzeuge hinzuzufügen:- Ein Auto:
V001,Toyota Camry, $45/Tag - Ein Motorrad:
V002,Honda CBR, $35/Tag - Einen LKW:
V003,Ford F-150, $75/Tag
C001,Alice Johnson) und geben Sie den Kunden aus. Geben Sie die Anforderungen des LKWs aus. Vermieten Sie das Auto für 3 Tage an Alice. Versuchen Sie, das Auto erneut zu mieten (sollte fehlschlagen). Schicken Sie das Motorrad zur Wartung. Geben Sie aus, wie viele Fahrzeuge verfügbar sind alsAvailable vehicles: X. Geben Sie das Auto zurück. Geben Sie die finale Anzahl der verfügbaren Fahrzeuge aus.- Ein Auto:
Erwartete Ausgabe:
Added: [Car] Toyota Camry (V001) - Available
Added: [Motorcycle] Honda CBR (V002) - Available
Added: [Truck] Ford F-150 (V003) - Available
Customer: Alice Johnson (C001) - 0 rentals
Commercial license, Deposit required
C001 rented V001 for 3 days. Cost: $135.00
Vehicle not available
V002 sent to maintenance
Available vehicles: 1
V001 returned
Available vehicles: 2Probier es selbst
import 'rental_service.dart';
import 'vehicle_factory.dart';
import 'customer.dart';
void main() {
// TODO: Erstelle eine RentalService Instanz
// TODO: Verwende die VehicleFactory, um drei Fahrzeuge zu erstellen und hinzuzufügen:
// - Car: V001, Toyota Camry, $45/Tag
// - Motorcycle: V002, Honda CBR, $35/Tag
// - Truck: V003, Ford F-150, $75/Tag
// TODO: Registriere einen Kunden (C001, Alice Johnson)
// TODO: Gib den Kunden aus
// TODO: Gib die Anforderungen des LKWs aus (suche den Truck und rufe getRequirements() auf)
// TODO: Vermiete das Auto (V001) an Alice (C001) für 3 Tage
// TODO: Versuche, das Auto erneut zu vermieten (sollte fehlschlagen - nicht verfügbar)
// TODO: Schicke das Motorrad (V002) zur Wartung
// TODO: Gib die Anzahl der verfügbaren Fahrzeuge als 'Available vehicles: X' aus
// TODO: Gib das Auto (V001) zurück
// TODO: Gib die endgültige Anzahl der verfügbaren Fahrzeuge aus
}
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienBibliotheken & ImportsEinführung in die OOPKlassen vs. ObjekteDas this-SchlüsselwortMethodenInstanzvariablenKonstruktor-GrundlagenWiederholung – Einfacher Taschenrechner4Null-Sicherheit
Einführung in Null-SicherheitNullable vs. Non-NullableDie ? und ! OperatorenLate-Schlüsselwort & Null-SicherheitNull-aware OperatorenNull-Sicherheit in KlassenZusammenfassung – Benutzerprofil-System7Abstrakte Klassen & Interfaces
Abstrakte KlassenAbstrakte MethodenInterfaces in DartImplizite InterfacesImplementieren vs. ErweiternMehrfache InterfacesRückblick – Shape Calculator10Collections & Generics
Überblick über List, Set und MapTypsichere CollectionsGenerische KlassenGenerische MethodenGenerische ConstraintsIterable & IteratorZusammenfassung – Generische Speicherung13Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungExtension MethodsCallable ClassesSealed Classes (Dart 3)Records (Dart 3)Patterns & Matching (3.0)Enums mit Methoden16Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen2Konstruktoren in Dart
Standard-KonstruktorBenannte KonstruktorenInitialisierungslistenKonstante KonstruktorenFactory-KonstruktorenWeiterleitende KonstruktorenZusammenfassung – Shape Builder5Kapselung
Öffentliche vs. private MemberDie _ Präfix-KonventionSichtbarkeit auf Library-EbeneGetter & Setter im DetailInformation HidingRückblick – Schülerdatensätze8Mixins
Einführung in MixinsMixins erstellenMehrere Mixins verwendenDas on-Schlüsselwort in MixinsMixin vs. VererbungMixin vs. InterfaceZusammenfassung - Tiersystem11Spezielle Methoden
toString() überschreibenhashCode & == überschreibenComparable-Interfacecall()-MethodenoSuchMethod überschreibenZusammenfassung – Eigene Collection14Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster3Klasseneigenschaften
Instanz- vs. statische MemberFinal & Const FelderLate-VariablenStatische Methoden & FelderGetter und SetterZusammenfassung – Bankkonto-Manager6Vererbung
Grundlagen der VererbungDas super-SchlüsselwortMethoden überschreibenDie @override-AnnotationDas final-Klassen-SchlüsselwortKonstruktoren & VererbungRückblick – Mitarbeiter-Hierarchie9Polymorphismus
Polymorphismus-GrundlagenPolymorphismus über InterfacesTypprüfung zur LaufzeitDie is & as OperatorenDas covariant SchlüsselwortZusammenfassung – Payment Processor