Menu
Coddy logo textTech

Fahrzeugvermietungsdienst

Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy. Lektion 87 von 87.

Für diese letzte Herausforderung wirst du ein Fahrzeugvermietungssystem bauen, das alle OOP-Konzepte zusammenführt, die du im Laufe dieses Kurses gemeistert hast.

Ihr System sollte eine Flotte verschiedener Fahrzeugtypen modellieren. Betrachten Sie eine Basisklasse Vehicle mit gemeinsamen Eigenschaften wie Kennzeichen, Marke und täglichem Mietsatz. Unterklassen wie Car, Motorcycle und Truck können diese um spezifische Attribute wie die Anzahl der Sitze, den Hubraum oder die Ladekapazität erweitern.

Schnittstellen können Mietverhalten definieren: Eine Rentable-Schnittstelle könnte Methoden wie rent(), returnVehicle() und calculateCost(int days) deklarieren. Verschiedene Fahrzeugtypen könnten Preisstrategien unterschiedlich implementieren, wodurch dies ein perfekter Anwendungsfall für Polymorphie ist.

Überlegen Sie, wie eine RentalAgency Klasse die Flotte mittels Komposition verwaltet.

Benutzerdefinierte Exceptions wie VehicleNotAvailableException können Sonderfälle behandeln.

Sie könnten das Factory-Pattern anwenden, um Fahrzeuge zu erstellen, oder Enums für Fahrzeugkategorien und den Mietstatus verwenden.

Diese Herausforderung testet Ihre Fähigkeit, ein vollständiges, gut strukturiertes OOP-System zu entwerfen. Viel Glück!

challenge icon

Aufgabe

Einfach

Lass uns einen vollständigen Fahrzeugverleih entwickeln, der alles zusammenführt, was du über OOP gelernt hast! Du erstellst ein System, das eine Flotte verschiedener Fahrzeugtypen verwaltet, Vermietungen mit geeigneter Validierung abwickelt und ein Factory Pattern zum Erstellen von Fahrzeugen verwendet.

Du organisierst deinen Code über sieben Dateien:

  • RentalStatus.java: Erstelle ein Enum, das den Vermietungsstatus eines Fahrzeugs darstellt. Füge die Werte AVAILABLE, RENTED und MAINTENANCE hinzu. Füge ein privates Feld description (String), einen Konstruktor und einen Getter hinzu. AVAILABLE sollte die Beschreibung "ready to rent" haben, RENTED sollte "currently in use" haben und MAINTENANCE sollte "under service" haben.
  • VehicleNotAvailableException.java: Erstelle eine benutzerdefinierte Exception, die Exception erweitert. Der Konstruktor sollte ein Kennzeichen akzeptieren und eine Nachricht im Format Vehicle not available: [licensePlate] erstellen.
  • Rentable.java: Erstelle ein Interface, das Vermietungsoperationen definiert. Deklariere die Methoden rent(), die einen Boolean zurückgibt, returnVehicle(), die einen Boolean zurückgibt, und calculateCost(int days), die einen Double zurückgibt.
  • Vehicle.java: Erstelle eine abstrakte Basisklasse für alle Fahrzeuge. Füge private Felder für licensePlate (String), brand (String), dailyRate (Double) und status (RentalStatus, initialisiert auf AVAILABLE) hinzu. Der Konstruktor erhält licensePlate, brand und dailyRate. Füge geeignete Getter und einen Setter für status hinzu. Deklariere eine abstrakte Methode getVehicleType(), die einen String zurückgibt. Implementiere eine Methode getDetails(), die "[licensePlate] [brand] ([vehicleType]) - $[dailyRate]/day - [status description]" zurückgibt, wobei dailyRate mit 2 Dezimalstellen formatiert wird.
  • Car.java: Erstelle eine Klasse, die Vehicle erweitert und Rentable implementiert. Füge ein privates Feld seats (int) hinzu. Der Konstruktor erhält licensePlate, brand, dailyRate und seats. Implementiere getVehicleType() so, dass "Car" zurückgegeben wird. Bei rent() soll der Status, wenn er AVAILABLE ist, auf RENTED gesetzt und true zurückgegeben werden; andernfalls soll false zurückgegeben werden. Bei returnVehicle() soll der Status, wenn er RENTED ist, auf AVAILABLE gesetzt und true zurückgegeben werden; andernfalls soll false zurückgegeben werden. Bei calculateCost(int days) soll dailyRate multipliziert mit days zurückgegeben werden.
  • Motorcycle.java: Erstelle eine Klasse, die Vehicle erweitert und Rentable implementiert. Füge ein privates Feld engineCC (int) hinzu. Der Konstruktor erhält licensePlate, brand, dailyRate und engineCC. Implementiere getVehicleType() so, dass "Motorcycle" zurückgegeben wird. Implementiere die Rentable-Methoden auf dieselbe Weise wie bei Car, aber calculateCost() soll einen Rabatt von 10 % anwenden (Multiplikation mit 0.9).
  • RentalAgency.java: Erstelle eine Klasse, die die Fahrzeugflotte mit einer ArrayList verwaltet. Füge folgende Methoden hinzu:
    • addVehicle(Vehicle vehicle) – fügt ein Fahrzeug zur Flotte hinzu
    • findVehicle(String licensePlate) – gibt das Vehicle oder null zurück
    • rentVehicle(String licensePlate, int days) – sucht das Fahrzeug, versucht, es zu vermieten (durch Umwandlung in Rentable), und gibt die Mietkosten zurück. Wirf VehicleNotAvailableException, wenn das Fahrzeug nicht gefunden wurde oder wenn rent() false zurückgibt
    • returnVehicle(String licensePlate) – sucht das Fahrzeug und gibt es zurück, wobei bei Erfolg true zurückgegeben wird
    • getAvailableVehicles() – gibt eine ArrayList von Fahrzeugen mit dem Status AVAILABLE zurück
  • Main.java: Erstelle deinen Fahrzeugverleih! Du erhältst einen durch Kommas getrennten Befehlsstring:
    • ADD_CAR:licensePlate:brand:dailyRate:seats
    • ADD_MOTORCYCLE:licensePlate:brand:dailyRate:engineCC
    • RENT:licensePlate:days
    • RETURN:licensePlate
    • AVAILABLE

    Verarbeite jeden Befehl und gib Folgendes aus:

    • ADD_CAR/ADD_MOTORCYCLE: Added: [brand] ([vehicleType])
    • RENT: Rented [licensePlate] for [days] days - Total: $[cost] (Kosten mit 2 Dezimalstellen) oder Error: [exception message]
    • RETURN: Returned: [licensePlate] oder Return failed: [licensePlate]
    • AVAILABLE: Gib Available vehicles: aus, gefolgt von den Details jedes verfügbaren Fahrzeugs in separaten Zeilen

    Gib nach allen Befehlen --- Fleet Summary --- aus, gefolgt von den Details jedes Fahrzeugs.

Du erhältst eine Eingabe: den durch Kommas getrennten Befehlsstring.

Bei der Eingabe ADD_CAR:ABC-123:Toyota:50.00:5,ADD_MOTORCYCLE:XYZ-789:Honda:40.00:600,RENT:ABC-123:3,RENT:ABC-123:2,AVAILABLE,RETURN:ABC-123 wäre deine Ausgabe beispielsweise:

Added: Toyota (Car)
Added: Honda (Motorcycle)
Rented ABC-123 for 3 days - Total: $150.00
Error: Vehicle not available: ABC-123
Available vehicles:
XYZ-789 Honda (Motorcycle) - $40.00/day - ready to rent
Returned: ABC-123
--- Fleet Summary ---
ABC-123 Toyota (Car) - $50.00/day - ready to rent
XYZ-789 Honda (Motorcycle) - $40.00/day - ready to rent

Diese Herausforderung verbindet Vererbung (Vehicle-Hierarchie), Interfaces (Rentable), Enums (RentalStatus), benutzerdefinierte Exceptions, Polymorphismus (einheitlicher Umgang mit verschiedenen Fahrzeugtypen) und Komposition (RentalAgency verwaltet Fahrzeuge) zu einem vollständigen Fahrzeugverleihsystem!

Probier es selbst

import java.util.Scanner;
import java.util.ArrayList;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();
        
        // TODO: Erstelle eine RentalAgency-Instanz
        
        // TODO: Teile die Eingabe durch Kommas, um einzelne Befehle zu erhalten
        
        // TODO: Verarbeite jeden Befehl:
        // ADD_CAR:licensePlate:brand:dailyRate:seats -> gib "Added: [brand] ([vehicleType])" aus
        // ADD_MOTORCYCLE:licensePlate:brand:dailyRate:engineCC -> gib "Added: [brand] ([vehicleType])" aus
        // RENT:licensePlate:days -> gib "Rented [licensePlate] for [days] days - Total: $[cost]" aus (2 Dezimalstellen)
        //                           oder "Error: [exception message]", falls eine Exception geworfen wird
        // RETURN:licensePlate -> gib "Returned: [licensePlate]" oder "Return failed: [licensePlate]" aus
        // AVAILABLE -> gib "Available vehicles:" aus, gefolgt von den Details jedes verfügbaren Fahrzeugs
        
        // TODO: Gib nach allen Befehlen "--- Fleet Summary ---" aus
        // gefolgt von den Details jedes Fahrzeugs
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Java-Compiler