Menu
Coddy logo textTech

Fahrzeugvermietung

Teil des Abschnitts Objektorientierte Programmierung der C#-Journey von Coddy — Lektion 70 von 70.

challenge icon

Aufgabe

Einfach

Lassen Sie uns einen Fahrzeugvermietungsdienst aufbauen, der Vererbung, Schnittstellen und das Strategy-Muster vereint! Sie erstellen ein System, in dem verschiedene Fahrzeugtypen mit flexiblen Preisstrategien gemietet werden können - dies demonstriert, wie OOP wartbare und erweiterbare Geschäftslogik ermöglicht.

Sie werden Ihren Code über sechs Dateien organisieren:

  • Vehicle.cs: Erstellen Sie Ihre Fahrzeughierarchie im Namespace Rental.Models. Die Basisklasse Vehicle sollte schreibgeschützte Eigenschaften für LicensePlate und Brand, eine DailyRate (decimal) und eine Eigenschaft IsAvailable mit einem privaten Setter haben, der über die Methoden MarkAsRented() und MarkAsReturned() gesteuert wird. Erstellen Sie dann drei abgeleitete Klassen: Car mit einer Eigenschaft Seats, Motorcycle mit einer Eigenschaft EngineCC und Truck mit einer Eigenschaft CargoCapacity (decimal). Jede abgeleitete Klasse sollte den Basiskonstruktor aufrufen und ihre spezifische Eigenschaft setzen.
  • IPricingStrategy.cs: Definieren Sie das Interface IPricingStrategy im Namespace Rental.Pricing mit einer einzigen Methode CalculatePrice(Vehicle vehicle, int days), die einen decimal-Wert zurückgibt.
  • PricingStrategies.cs: Implementieren Sie zwei Preisstrategien im Namespace Rental.Pricing. StandardPricing multipliziert einfach die Tagesrate des Fahrzeugs mit der Anzahl der Tage. WeekendDiscountPricing gewährt einen Rabatt von 10 % (Multiplikation mit 0.9), wenn die Miete 2 oder mehr Tage beträgt, andernfalls wird die Standardberechnung verwendet.
  • RentalRecord.cs: Erstellen Sie eine Klasse Rental im Namespace Rental.Models, um Vermietungen zu verfolgen. Sie sollte schreibgeschützte Eigenschaften für CustomerName (string), Vehicle (Vehicle), Days (int) und TotalPrice (decimal) haben, die alle über den Konstruktor gesetzt werden.
  • RentalService.cs: Erstellen Sie eine Klasse RentalService im Namespace Rental.Services, die die Flotte verwaltet und Vermietungen verarbeitet. Sie erhält eine IPricingStrategy über ihren Konstruktor (Dependency Injection). Implementieren Sie:
    • AddVehicle(Vehicle vehicle) - fügt ein Fahrzeug zur Flotte hinzu
    • RentVehicle(string customerName, string licensePlate, int days) - gibt ein Rental-Objekt zurück, wenn das Fahrzeug existiert und verfügbar ist, andernfalls null. Denken Sie daran, das Fahrzeug als vermietet zu markieren und den Preis mit der injizierten Strategie zu berechnen.
    • ReturnVehicle(string licensePlate) - markiert das Fahrzeug als verfügbar und gibt true zurück, wenn dies erfolgreich war
    • GetAvailableVehicles() - gibt eine Liste aller verfügbaren Fahrzeuge zurück
  • Program.cs: Führen Sie alles zusammen, indem Sie Fahrzeuge erstellen, den Dienst mit einer Preisstrategie einrichten und Vermietungsvorgänge basierend auf der Eingabe verarbeiten.

Sie erhalten die folgenden Eingaben:

  • Zu verwendende Preisstrategie (standard oder weekend)
  • Anzahl der hinzuzufügenden Fahrzeuge
  • Für jedes Fahrzeug: Typ (car, motorcycle oder truck), Kennzeichen, Marke, Tagesrate und typspezifischer Wert (Sitze, Hubraum oder Ladekapazität)
  • Anzahl der auszuführenden Operationen
  • Für jede Operation: die Aktion gefolgt von den relevanten Daten

Operationsformate:

rent
{customerName}
{licensePlate}
{days}

return
{licensePlate}

available

Ausgabeformate:

  • Miete erfolgreich: Rented: {Brand} ({LicensePlate}) to {CustomerName} for {Days} days - Total: {TotalPrice}
  • Miete fehlgeschlagen: Rental failed: {licensePlate}
  • Rückgabe erfolgreich: Returned: {licensePlate}
  • Rückgabe fehlgeschlagen: Return failed: {licensePlate}
  • Verfügbar: Geben Sie jedes verfügbare Fahrzeug als {Type}: {Brand} ({LicensePlate}) - {DailyRate}/day aus, wobei Type "Car", "Motorcycle" oder "Truck" ist

Beispiel für Eingaben:

weekend
3
car
ABC-123
Toyota
50
5
motorcycle
XYZ-789
Honda
30
600
truck
TRK-001
Ford
80
2000
5
available
rent
Alice
ABC-123
3
rent
Bob
ABC-123
2
available
return
ABC-123

Die Ausgabe sollte wie folgt aussehen:

Car: Toyota (ABC-123) - 50/day
Motorcycle: Honda (XYZ-789) - 30/day
Truck: Ford (TRK-001) - 80/day
Rented: Toyota (ABC-123) to Alice for 3 days - Total: 135
Rental failed: ABC-123
Motorcycle: Honda (XYZ-789) - 30/day
Truck: Ford (TRK-001) - 80/day
Returned: ABC-123

Beachten Sie, wie die Preisstrategie in den Dienst injiziert wird - Sie könnten StandardPricing problemlos gegen WeekendDiscountPricing austauschen, ohne den Code von RentalService überhaupt zu ändern. Dies ist die Stärke des Strategy-Musters in Kombination mit Dependency Injection!

Probier es selbst

using System;
using System.Collections.Generic;
using Rental.Models;
using Rental.Pricing;
using Rental.Services;

class Program
{
    public static void Main(string[] args)
    {
        // Preissstrategie-Typ einlesen
        string strategyType = Console.ReadLine();
        
        // TODO: Erstelle die passende Preisstrategie basierend auf der Eingabe
        // "standard" -> StandardPricing
        // "weekend" -> WeekendDiscountPricing
        IPricingStrategy strategy = null; // TODO: Basierend auf strategyType initialisieren
        
        // TODO: RentalService mit der Preisstrategie erstellen
        
        // Anzahl der Fahrzeuge einlesen
        int vehicleCount = Convert.ToInt32(Console.ReadLine());
        
        // TODO: Jedes Fahrzeug einlesen und zum Service hinzufügen
        // Für jedes Fahrzeug einlesen:
        // - Typ (car, motorcycle, truck)
        // - Kennzeichen (license plate)
        // - Marke (brand)
        // - Tagesrate (daily rate)
        // - typspezifischer Wert (seats, engineCC oder cargo capacity)
        
        // Anzahl der Operationen einlesen
        int operationCount = Convert.ToInt32(Console.ReadLine());
        
        // TODO: Jede Operation verarbeiten
        // Operationen: rent, return, available
        // 
        // Für "rent":
        //   customerName, licensePlate, days einlesen
        //   Ausgabe: "Rented: {Brand} ({LicensePlate}) to {CustomerName} for {Days} days - Total: {TotalPrice}"
        //   Oder: "Rental failed: {licensePlate}"
        //
        // Für "return":
        //   licensePlate einlesen
        //   Ausgabe: "Returned: {licensePlate}" oder "Return failed: {licensePlate}"
        //
        // Für "available":
        //   Jedes verfügbare Fahrzeug wie folgt ausgeben:
        //   "{Type}: {Brand} ({LicensePlate}) - {DailyRate}/day"
    }
}

Alle Lektionen in Objektorientierte Programmierung