Menu
Coddy logo textTech

Fahrzeugvermietung

Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy. Lektion 110 von 110.

challenge icon

Aufgabe

Einfach

Herzlichen 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 Klasse VehicleState, die festlegt, wie sich Fahrzeuge in verschiedenen Zuständen verhalten. Füge die abstrakten Methoden String getStatus() und bool canRent() hinzu. Erstelle anschließend drei konkrete Zustände:
    • AvailableState – gibt Available zurück und erlaubt die Vermietung
    • RentedState – gibt Rented zurück und erlaubt die Vermietung nicht
    • MaintenanceState – gibt In Maintenance zurück und erlaubt die Vermietung nicht
  • vehicle.dart: Erstelle eine abstrakte Klasse Vehicle mit einer final-ID (String), einem final-Modell (String), dem privaten _dailyRate (double) mit einem Getter sowie dem privaten _state (VehicleState), der mit AvailableState initialisiert 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 erlaubt
    • void 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
    Überschreibe toString(), sodass [Type] model (id) - status zurückgegeben wird, wobei Type dem Laufzeittyp entspricht.
  • vehicles.dart: Erstelle drei von Vehicle abgeleitete Fahrzeugtypen:
    • Car – die standardmäßigen Mietkosten entsprechen dem Tagessatz multipliziert mit der Anzahl der Tage. Anforderungen: Valid driver's license
    • Motorcycle – 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 Klasse VehicleFactory mit der statischen Methode Vehicle create(String type, String id, String model, double dailyRate), die abhängig vom Typ (car, motorcycle oder truck) das entsprechende Fahrzeug zurückgibt. Bei unbekannten Typen soll standardmäßig ein Car erstellt werden.
  • customer.dart: Erstelle eine Klasse Customer mit 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 hinzu
    • getRentalCount() – gibt die Anzahl der Vermietungen zurück
    • bool isEligible() – gibt true zurück, wenn der Kunde weniger als 3 aktive Vermietungen hat
    Überschreibe toString(), sodass Customer: name (id) - X rentals zurückgegeben wird.
  • rental_service.dart: Erstelle eine Klasse RentalService unter Verwendung von Generics mit einer List<Vehicle> für die Fahrzeugflotte und einer List<Customer> für die Kunden. Füge Folgendes hinzu:
    • addVehicle(Vehicle vehicle) – fügt ein Fahrzeug der Flotte hinzu und gibt Added: vehicle.toString() aus
    • registerCustomer(Customer customer) – fügt einen Kunden hinzu
    • rentVehicle(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 gibt customerId rented vehicleId for X days. Cost: $Y aus (Y wird mit 2 Dezimalstellen formatiert). Andernfalls wird die entsprechende Meldung ausgegeben: Customer not found, Customer not eligible, Vehicle not found oder Vehicle not available
    • returnVehicle(String vehicleId) – setzt den Fahrzeugzustand auf Available und gibt vehicleId returned aus
    • sendToMaintenance(String vehicleId) – setzt den Fahrzeugzustand auf Maintenance und gibt vehicleId sent to maintenance aus
    • getAvailableVehicles() – gibt eine Liste verfügbarer Fahrzeuge zurück
  • main.dart: Führe den Vermietungsdienst vor. Erstelle einen RentalService und 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
    Registriere einen Kunden (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 als Available vehicles: X aus. Gib das Auto zurück. Gib die endgültige Anzahl verfügbarer Fahrzeuge aus.

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: 2

Probier 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

Übe selbstständig: Online-Dart-Compiler