Wypożyczalnia pojazdów
Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 110 z 110.
Wyzwanie
ŁatwyGratulacje 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()orazbool canRent(). Następnie utwórz trzy konkretne stany:AvailableState— zwracaAvailablei pozwala na wynajemRentedState— zwracaRentedi nie pozwala na wynajemMaintenanceState— zwracaIn Maintenancei nie pozwala na wynajem
vehicle.dart: Utwórz abstrakcyjną klasęVehiclez polami:finalid (String),finalmodel (String), prywatne_dailyRate(double) z getterem oraz prywatne_state(VehicleState), zainicjalizowane jakoAvailableState. Dodaj:- Getter
status, który zwraca status stanu bool isAvailable()— sprawdza, czy bieżący stan pozwala na wynajemvoid setState(VehicleState state)— zmienia stan pojazdu- Metodę abstrakcyjną
double calculateRentalCost(int days) - Metodę abstrakcyjną
String getRequirements()— zwraca wszelkie wymagania specjalne
toString(), aby zwracała[Type] model (id) - status, gdzie Type oznacza typ czasu wykonania.- Getter
vehicles.dart: Utwórz trzy typy pojazdów dziedziczące poVehicle:Car— standardowy koszt wynajmu to stawka dzienna pomnożona przez liczbę dni. Wymagania:Valid driver's licenseMotorcycle— 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ęVehicleFactoryze statyczną metodąVehicle create(String type, String id, String model, double dailyRate), która zwraca odpowiedni pojazd na podstawie typu (car,motorcyclelubtruck). W przypadku nieznanych typów domyślnie twórz obiekt Car.customer.dart: Utwórz klasęCustomerz polami id (String), name (String) i prywatną listą rejestrów wynajmu (lista Stringów). Dodaj:addRental(String vehicleInfo)— dodaje rejestr wynajmugetRentalCount()— zwraca liczbę wynajmówbool isEligible()— zwraca true, jeśli klient ma mniej niż 3 aktywne wynajmy
toString(), aby zwracałaCustomer: name (id) - X rentals.rental_service.dart: Utwórz klasęRentalServicewykorzystują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świetlaAdded: vehicle.toString()registerCustomer(Customer customer)— dodaje klientarentVehicle(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świetlacustomerId 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 foundlubVehicle not availablereturnVehicle(String vehicleId)— ustawia stan pojazdu na Available i wyświetlavehicleId returnedsendToMaintenance(String vehicleId)— ustawia stan pojazdu na Maintenance i wyświetlavehicleId sent to maintenancegetAvailableVehicles()— zwraca listę dostępnych pojazdów
main.dart: Zademonstruj działanie usługi wynajmu. Utwórz obiektRentalServicei 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ń
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 formacieAvailable vehicles: X. Zwróć samochód. Wyświetl końcową liczbę dostępnych pojazdów.- Samochód:
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: 2Spró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
1Podstawy OOP
Pliki zewnętrzneBiblioteki i importyWprowadzenie do OOPKlasy a obiektySłowo kluczowe thisMetodyZmienne instancjiPodstawy konstruktorówPowtórka – prosty kalkulator4Bezpieczeństwo wartości null
Wprowadzenie do bezpieczeństwa wartości nullTypy dopuszczające null i niedopuszczające nullOperatory ? i !Słowo kluczowe late a bezpieczeństwo wartości nullOperatory uwzględniające nullBezpieczeństwo wartości null w klasachPodsumowanie — system profili użytkowników7Klasy abstrakcyjne i interfejsy
Klasy abstrakcyjneMetody abstrakcyjneInterfejsy w DartInterfejsy niejawneImplementowanie a rozszerzanieWiele interfejsówPowtórka — kalkulator kształtów10Kolekcje i typy generyczne
Przegląd List, Set i MapKolekcje bezpieczne typowoKlasy generyczneMetody generyczneOgraniczenia typów generycznychIterable i IteratorPowtórka — generyczne przechowywanie danych13Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieMetody rozszerzająceKlasy wywoływalneKlasy zapieczętowane (Dart 3)Rekordy (Dart 3)Wzorce i dopasowywanie (3.0)Typy wyliczeniowe z metodami16Projekt: Zarządzanie biblioteką
Omówienie projektuKlasy książek i użytkowników2Konstruktory w Dart
Konstruktor domyślnyKonstruktory nazwaneListy inicjalizująceKonstruktory stałeKonstruktory fabryczneKonstruktory przekierowującePodsumowanie — budowanie kształtów5Hermetyzacja
Elementy publiczne a prywatneKonwencja prefiksu _Prywatność na poziomie bibliotekiGettery i settery — szczegółowoUkrywanie informacjiPodsumowanie — dane uczniów8Domieszki
Wprowadzenie do domieszekTworzenie domieszekKorzystanie z wielu domieszekSłowo kluczowe on w domieszkachDomieszka a dziedziczenieDomieszka a interfejsPodsumowanie – system zwierząt11Metody specjalne
Nadpisanie toString()Nadpisanie hashCode i ==Interfejs ComparableMetoda call()Nadpisanie noSuchMethodPodsumowanie — własna kolekcja14Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec Strategy3Właściwości klas
Elementy instancji a elementy statycznePola final i constZmienne inicjalizowane z opóźnieniemMetody i pola statyczneGettery i setteryPowtórzenie – menedżer kont bankowych6Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe superPrzesłanianie metodAdnotacja @overrideSłowo kluczowe final dla klasKonstruktory i dziedziczeniePowtórzenie – hierarchia pracowników9Polimorfizm
Podstawy polimorfizmuPolimorfizm za pomocą interfejsówSprawdzanie typu w czasie działaniaOperatory is i asSłowo kluczowe covariantPodsumowanie — procesor płatnościPoćwicz samodzielnie: Kompilator Dart online