Fahrzeugvermietung
Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy. Lektion 110 von 110.
Aufgabe
EinfachHerzlichen Glückwunsch, dass du die letzte Herausforderung des OOP-Kurses erreicht hast! Lass uns einen umfassenden Fahrzeugvermietungsdienst entwickeln, der alles zusammenführt, was du gelernt hast – abstrakte Klassen, Vererbung, Kapselung, das Zustandsmuster, das Fabrikmuster und Generics.
Dein Vermietungsdienst verwaltet verschiedene Fahrzeugtypen, verfolgt deren Verfügbarkeitsstatus, bearbeitet Vermietungen und verwaltet Kundendatensätze. Du organisierst dies über sieben Dateien:
vehicle_state.dart: Erstelle eine abstrakte KlasseVehicleState, die festlegt, wie sich Fahrzeuge in verschiedenen Zuständen verhalten. Füge die abstrakten MethodenString getStatus()undbool canRent()hinzu. Erstelle anschließend drei konkrete Zustände:AvailableState– gibtAvailablezurück und erlaubt die VermietungRentedState– gibtRentedzurück und erlaubt die Vermietung nichtMaintenanceState– gibtIn Maintenancezurück und erlaubt die Vermietung nicht
vehicle.dart: Erstelle eine abstrakte KlasseVehiclemit einerfinal-ID (String), einemfinal-Modell (String), dem privaten_dailyRate(double) mit einem Getter sowie dem privaten_state(VehicleState), der mitAvailableStateinitialisiert wird. Füge Folgendes hinzu:- Einen Getter
status, der den Status des Zustands zurückgibt bool isAvailable()– prüft, ob der aktuelle Zustand die Vermietung erlaubtvoid setState(VehicleState state)– ändert den Zustand des Fahrzeugs- Eine abstrakte Methode
double calculateRentalCost(int days) - Eine abstrakte Methode
String getRequirements()– gibt alle besonderen Anforderungen zurück
toString(), sodass[Type] model (id) - statuszurückgegeben wird, wobei Type dem Laufzeittyp entspricht.- Einen Getter
vehicles.dart: Erstelle drei vonVehicleabgeleitete Fahrzeugtypen:Car– die standardmäßigen Mietkosten entsprechen dem Tagessatz multipliziert mit der Anzahl der Tage. Anforderungen:Valid driver's licenseMotorcycle– die Mietkosten entsprechen dem Tagessatz multipliziert mit der Anzahl der Tage, abzüglich eines Rabatts von 10 %. Anforderungen:Motorcycle license, Age 21+Truck– die Mietkosten entsprechen dem Tagessatz multipliziert mit der Anzahl der Tage zuzüglich einer Pauschalgebühr von 50 $. Anforderungen:Commercial license, Deposit required
vehicle_factory.dart: Erstelle eine KlasseVehicleFactorymit der statischen MethodeVehicle create(String type, String id, String model, double dailyRate), die abhängig vom Typ (car,motorcycleodertruck) das entsprechende Fahrzeug zurückgibt. Bei unbekannten Typen soll standardmäßig ein Car erstellt werden.customer.dart: Erstelle eine KlasseCustomermit einer ID (String), einem Namen (String) und einer privaten Liste von Mietdatensätzen (Liste von Strings). Füge Folgendes 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(), sodassCustomer: name (id) - X rentalszurückgegeben wird.rental_service.dart: Erstelle eine KlasseRentalServiceunter Verwendung von Generics mit einerList<Vehicle>für die Fahrzeugflotte und einerList<Customer>für die Kunden. Füge Folgendes hinzu:addVehicle(Vehicle vehicle)– fügt ein Fahrzeug der Flotte hinzu und gibtAdded: vehicle.toString()ausregisterCustomer(Customer customer)– fügt einen Kunden hinzurentVehicle(String customerId, String vehicleId, int days)– wenn der Kunde existiert, berechtigt ist und das Fahrzeug verfügbar ist: Ändert den Fahrzeugzustand in Rented, fügt dem Kunden eine Vermietung hinzu und gibtcustomerId rented vehicleId for X days. Cost: $Yaus (Y wird mit 2 Dezimalstellen formatiert). Andernfalls wird die entsprechende Meldung ausgegeben:Customer not found,Customer not eligible,Vehicle not foundoderVehicle not availablereturnVehicle(String vehicleId)– setzt den Fahrzeugzustand auf Available und gibtvehicleId returnedaussendToMaintenance(String vehicleId)– setzt den Fahrzeugzustand auf Maintenance und gibtvehicleId sent to maintenanceausgetAvailableVehicles()– gibt eine Liste verfügbarer Fahrzeuge zurück
main.dart: Führe den Vermietungsdienst vor. Erstelle einenRentalServiceund verwende die Factory, um drei Fahrzeuge hinzuzufügen:- Ein Auto:
V001,Toyota Camry, 45 $/Tag - Ein Motorrad:
V002,Honda CBR, 35 $/Tag - Ein Lkw:
V003,Ford F-150, 75 $/Tag
C001,Alice Johnson) und gib den Kunden aus. Gib die Anforderungen des Lkws aus. Vermiete das Auto für 3 Tage an Alice. Versuche, das Auto erneut zu vermieten (dies sollte fehlschlagen). Schicke das Motorrad zur Wartung. Gib die Anzahl der verfügbaren Fahrzeuge alsAvailable vehicles: Xaus. Gib das Auto zurück. Gib die endgültige Anzahl verfügbarer 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 Schlüsselwort thisMethodenInstanzvariablenGrundlagen von KonstruktorenRückblick – Einfacher Taschenrechner4Null-Sicherheit
Einführung in die Null-SicherheitNullable vs. Non-NullableDie Operatoren ? und !Late-Schlüsselwort und Null-SicherheitNull-bewusste OperatorenNull-Sicherheit in KlassenRückblick – Benutzers профilsystem7Abstrakte Klassen & Interfaces
Abstrakte KlassenAbstrakte MethodenInterfaces in DartImplizite InterfacesImplementieren vs. ErweiternMehrere InterfacesZusammenfassung – Formrechner10Collections & Generics
Übersicht über List, Set und MapTypsichere CollectionsGenerische KlassenGenerische MethodenGenerische EinschränkungenIterable & IteratorRückblick – Generischer Speicher13Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungErweiterungsmethodenAufrufbare KlassenVersiegelte Klassen (Dart 3)Records (Dart 3)Muster & Matching (3.0)Enums mit Methoden16Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen2Konstruktoren in Dart
StandardkonstruktorBenannte KonstruktorenInitialisierungslistenKonstantenkonstruktorenFactory-KonstruktorenWeiterleitende KonstruktorenRückblick – Shape Builder5Kapselung
Öffentliche vs. private MemberDie _-Präfix-KonventionBibliotheksweite SichtbarkeitTiefergehende Getter & SetterInformationsverbergungRückblick – Studierendendaten8Mixins
Einführung in MixinsMixins erstellenMehrere Mixins verwendenDas Schlüsselwort „on“ in MixinsMixin vs. VererbungMixin vs. SchnittstelleRückblick – Tiersystem11Spezielle Methoden
toString()-ÜberschreibunghashCode- & ==-ÜberschreibungComparable-Schnittstellecall()-MethodenoSuchMethod-ÜberschreibungWiederholung – Benutzerdefinierte Collection14Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFabrikmusterBeobachtermusterStrategiemuster17Abschließende Herausforderungen
E-Learning-PlattformBankingsystemSpielcharaktersystemFahrzeugvermietung3Klassen-Eigenschaften
Instanz- vs. statische MemberFinal- und Const-FelderLate-VariablenStatische Methoden und FelderGetter und SetterRückblick – Bankkontoverwaltung6Vererbung
Grundlegende VererbungDas Schlüsselwort superMethodenüberschreibungDie Annotation @overrideDas Schlüsselwort final für KlassenKonstruktoren und VererbungZusammenfassung – Mitarbeiterhierarchie9Polymorphismus
Grundlagen des PolymorphismusPolymorphismus über InterfacesLaufzeit-TypüberprüfungDie Operatoren is & asCovariant-SchlüsselwortZusammenfassung – ZahlungsprozessorÜbe selbstständig: Online-Dart-Compiler