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 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 Klasse VehicleState, die definiert, wie sich Fahrzeuge in verschiedenen Zuständen verhalten. Fügen Sie eine abstrakte Methode String getStatus() und bool canRent() hinzu. Erstellen Sie dann drei konkrete Zustände:
    • AvailableState – gibt Available zurück und erlaubt die Vermietung
    • RentedState – gibt Rented zurück und erlaubt keine Vermietung
    • MaintenanceState – gibt In Maintenance zurück und erlaubt keine Vermietung
  • vehicle.dart: Erstellen Sie eine abstrakte Klasse Vehicle mit einer final id (String), einem final model (String), einer privaten _dailyRate (double) mit einem Getter und einem privaten _state (VehicleState), der mit AvailableState initialisiert 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ässt
    • void 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
    Überschreiben Sie toString(), um [Type] model (id) - status zurückzugeben, wobei Type der Laufzeittyp ist.
  • vehicles.dart: Erstellen Sie drei Fahrzeugtypen, die Vehicle erweitern:
    • Car – Standard-Mietkosten sind Tagesrate mal Tage. Anforderungen: Valid driver's license
    • Motorcycle – 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 Klasse VehicleFactory mit einer statischen Methode Vehicle create(String type, String id, String model, double dailyRate), die das entsprechende Fahrzeug basierend auf dem Typ (car, motorcycle oder truck) zurückgibt. Erstellen Sie bei unbekannten Typen standardmäßig ein Car.
  • customer.dart: Erstellen Sie eine Klasse Customer mit 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 hinzu
    • getRentalCount() – gibt die Anzahl der Vermietungen zurück
    • bool isEligible() – gibt true zurück, wenn der Kunde weniger als 3 aktive Vermietungen hat
    Überschreiben Sie toString(), um Customer: name (id) - X rentals zurückzugeben.
  • rental_service.dart: Erstellen Sie eine Klasse RentalService unter Verwendung von Generics mit einer List<Vehicle> für die Flotte und einer List<Customer> für Kunden. Fügen Sie hinzu:
    • addVehicle(Vehicle vehicle) – fügt zur Flotte hinzu, gibt Added: vehicle.toString() aus
    • registerCustomer(Customer customer) – registriert den Kunden
    • rentVehicle(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, gibt customerId rented vehicleId for X days. Cost: $Y aus (Y auf 2 Dezimalstellen formatiert). Geben Sie andernfalls eine entsprechende Nachricht aus: Customer not found, Customer not eligible, Vehicle not found oder Vehicle not available
    • returnVehicle(String vehicleId) – setzt den Fahrzeugzustand auf Available, gibt vehicleId returned aus
    • sendToMaintenance(String vehicleId) – setzt den Fahrzeugzustand auf Maintenance, gibt vehicleId sent to maintenance aus
    • getAvailableVehicles() – gibt eine Liste der verfügbaren Fahrzeuge zurück
  • main.dart: Demonstrieren Sie Ihren Vermietungsservice. Erstellen Sie einen RentalService und 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
    Registrieren Sie einen Kunden (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 als Available vehicles: X. Geben Sie das Auto zurück. Geben Sie die finale Anzahl der verfügbaren 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