Menu
Coddy logo textTech

Wypożyczalnia pojazdów

Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 110 z 110.

challenge icon

Wyzwanie

Łatwy

Gratulacje z okazji dotarcia do ostatniego wyzwania kursu OOP! Zbudujmy kompleksową usługę wynajmu pojazdów, która łączy wszystko, czego się nauczyłeś — klasy abstrakcyjne, dziedziczenie, enkapsulację, wzorzec State, wzorzec Factory i typy generyczne.

Twoja usługa wynajmu będzie zarządzać różnymi typami pojazdów, śledzić ich stany dostępności, obsługiwać wynajem i prowadzić rejestry klientów. Zorganizujesz to w siedmiu plikach:

  • vehicle_state.dart: Utwórz abstrakcyjną klasę VehicleState, która określa zachowanie pojazdów w różnych stanach. Dodaj metodę abstrakcyjną String getStatus() oraz bool canRent(). Następnie utwórz trzy konkretne stany:
    • AvailableState — zwraca Available i pozwala na wynajem
    • RentedState — zwraca Rented i nie pozwala na wynajem
    • MaintenanceState — zwraca In Maintenance i nie pozwala na wynajem
  • vehicle.dart: Utwórz abstrakcyjną klasę Vehicle z polami: final id (String), final model (String), prywatne _dailyRate (double) z getterem oraz prywatne _state (VehicleState), zainicjalizowane jako AvailableState. Dodaj:
    • Getter status, który zwraca status stanu
    • bool isAvailable() — sprawdza, czy bieżący stan pozwala na wynajem
    • void setState(VehicleState state) — zmienia stan pojazdu
    • Metodę abstrakcyjną double calculateRentalCost(int days)
    • Metodę abstrakcyjną String getRequirements() — zwraca wszelkie wymagania specjalne
    Nadpisz toString(), aby zwracała [Type] model (id) - status, gdzie Type oznacza typ czasu wykonania.
  • vehicles.dart: Utwórz trzy typy pojazdów dziedziczące po Vehicle:
    • Car — standardowy koszt wynajmu to stawka dzienna pomnożona przez liczbę dni. Wymagania: Valid driver's license
    • Motorcycle — koszt wynajmu to stawka dzienna pomnożona przez liczbę dni, z uwzględnieniem 10% zniżki. Wymagania: Motorcycle license, Age 21+
    • Truck — koszt wynajmu to stawka dzienna pomnożona przez liczbę dni, plus stała opłata w wysokości $50. Wymagania: Commercial license, Deposit required
  • vehicle_factory.dart: Utwórz klasę VehicleFactory ze statyczną metodą Vehicle create(String type, String id, String model, double dailyRate), która zwraca odpowiedni pojazd na podstawie typu (car, motorcycle lub truck). W przypadku nieznanych typów domyślnie twórz obiekt Car.
  • customer.dart: Utwórz klasę Customer z polami id (String), name (String) i prywatną listą rejestrów wynajmu (lista Stringów). Dodaj:
    • addRental(String vehicleInfo) — dodaje rejestr wynajmu
    • getRentalCount() — zwraca liczbę wynajmów
    • bool isEligible() — zwraca true, jeśli klient ma mniej niż 3 aktywne wynajmy
    Nadpisz toString(), aby zwracała Customer: name (id) - X rentals.
  • rental_service.dart: Utwórz klasę RentalService wykorzystującą typy generyczne, z listą List<Vehicle> dla floty oraz listą List<Customer> dla klientów. Dodaj:
    • addVehicle(Vehicle vehicle) — dodaje pojazd do floty i wyświetla Added: vehicle.toString()
    • registerCustomer(Customer customer) — dodaje klienta
    • rentVehicle(String customerId, String vehicleId, int days) — jeśli klient istnieje, kwalifikuje się do wynajmu, a pojazd jest dostępny: zmienia stan pojazdu na Rented, dodaje wynajem do rejestru klienta i wyświetla customerId rented vehicleId for X days. Cost: $Y (Y sformatowane do 2 miejsc po przecinku). W przeciwnym razie wyświetla odpowiedni komunikat: Customer not found, Customer not eligible, Vehicle not found lub Vehicle not available
    • returnVehicle(String vehicleId) — ustawia stan pojazdu na Available i wyświetla vehicleId returned
    • sendToMaintenance(String vehicleId) — ustawia stan pojazdu na Maintenance i wyświetla vehicleId sent to maintenance
    • getAvailableVehicles() — zwraca listę dostępnych pojazdów
  • main.dart: Zademonstruj działanie usługi wynajmu. Utwórz obiekt RentalService i użyj fabryki, aby dodać trzy pojazdy:
    • Samochód: V001, Toyota Camry, $45/dzień
    • Motocykl: V002, Honda CBR, $35/dzień
    • Ciężarówka: V003, Ford F-150, $75/dzień
    Zarejestruj klientkę (C001, Alice Johnson) i wyświetl informacje o niej. Wyświetl wymagania dotyczące ciężarówki. Wynajmij Alice samochód na 3 dni. Spróbuj wynająć samochód ponownie (powinno się nie udać). Wyślij motocykl do konserwacji. Wyświetl liczbę dostępnych pojazdów w formacie Available vehicles: X. Zwróć samochód. Wyświetl końcową liczbę dostępnych pojazdów.

Oczekiwany wynik:

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

Spróbuj swoich sił

import 'rental_service.dart';
import 'vehicle_factory.dart';
import 'customer.dart';

void main() {
  // TODO: Utwórz instancję RentalService
  
  // TODO: Użyj VehicleFactory, aby utworzyć i dodać trzy pojazdy:
  // - Samochód: V001, Toyota Camry, $45/dzień
  // - Motocykl: V002, Honda CBR, $35/dzień
  // - Ciężarówka: V003, Ford F-150, $75/dzień
  
  // TODO: Zarejestruj klientkę (C001, Alice Johnson)
  
  // TODO: Wyświetl dane klientki
  
  // TODO: Wyświetl wymagania dotyczące ciężarówki (znajdź ciężarówkę i wywołaj getRequirements())
  
  // TODO: Wypożycz samochód (V001) Alice (C001) na 3 dni
  
  // TODO: Spróbuj ponownie wypożyczyć samochód (powinno się nie udać — jest niedostępny)
  
  // TODO: Wyślij motocykl (V002) do serwisu
  
  // TODO: Wyświetl liczbę dostępnych pojazdów w formacie 'Available vehicles: X'
  
  // TODO: Zwróć samochód (V001)
  
  // TODO: Wypisz końcową liczbę dostępnych pojazdów
}

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Dart online