Menu
CoddyTech

车辆租赁服务

本课属于 Coddy Dart 学习旅程的“面向对象编程”单元。第 110 课,共 110 课。

challenge icon

挑战

简单

恭喜你来到 OOP 课程的最后一个挑战!让我们构建一个完整的车辆租赁服务,综合运用你学过的所有内容:抽象类、继承、封装、状态模式、工厂模式和泛型。

你的租赁服务将管理不同类型的车辆,跟踪车辆的可用状态,处理租赁业务,并维护客户记录。你需要将代码整理到 7 个文件中:

  • vehicle_state.dart:创建一个 VehicleState 抽象类,用于定义车辆在不同状态下的行为。包含抽象方法 String getStatus() 和 bool canRent()。然后创建 3 个具体状态:
    • AvailableState:返回 Available,并允许租赁
    • RentedState:返回 Rented,并且不允许租赁
    • MaintenanceState:返回 In Maintenance,并且不允许租赁
  • vehicle.dart:创建一个抽象 Vehicle 类,包含 final id(String)、final model(String)、带有 getter 的私有 _dailyRate(double),以及一个初始值为 AvailableState 的私有 _state(VehicleState)。包含:
    • 一个 status getter,返回状态的当前状态
    • bool isAvailable():检查当前状态是否允许租赁
    • void setState(VehicleState state):更改车辆的状态
    • 一个抽象方法 double calculateRentalCost(int days)
    • 一个抽象方法 String getRequirements():返回任何特殊要求
    重写 toString(),使其返回 [Type] model (id) - status,其中 Type 是运行时类型。
  • vehicles.dart:创建 3 种继承 Vehicle 的车辆类型:
    • Car:标准租赁费用为每日租金乘以天数。要求:Valid driver's license
    • Motorcycle:租赁费用为每日租金乘以天数,再打 9 折。要求:Motorcycle license, Age 21+
    • Truck:租赁费用为每日租金乘以天数,再加固定费用 $50。要求:Commercial license, Deposit required
  • vehicle_factory.dart:创建一个 VehicleFactory 类,并添加静态方法 Vehicle create(String type, String id, String model, double dailyRate),根据类型(car、motorcycle 或 truck)返回对应的车辆。对于未知类型,默认创建 Car。
  • customer.dart:创建一个 Customer 类,包含 id(String)、name(String)和一个用于存储租赁记录的私有列表(String 列表)。包含:
    • addRental(String vehicleInfo):添加一条租赁记录
    • getRentalCount():返回租赁数量
    • bool isEligible():如果客户当前的租赁数量少于 3,则返回 true
    重写 toString(),使其返回 Customer: name (id) - X rentals。
  • rental_service.dart:使用泛型创建一个 RentalService 类,使用 List<Vehicle> 存储车队车辆,使用 List<Customer> 存储客户。包含:
    • addVehicle(Vehicle vehicle):将车辆添加到车队,并打印 Added: vehicle.toString()
    • registerCustomer(Customer customer):添加客户
    • rentVehicle(String customerId, String vehicleId, int days):如果客户存在且符合租赁条件,并且车辆可用,则将车辆状态更改为 Rented,为客户添加租赁记录,并打印 customerId rented vehicleId for X days. Cost: $Y(Y 格式为 2 位小数)。否则,打印相应消息:Customer not found、Customer not eligible、Vehicle not found 或 Vehicle not available
    • returnVehicle(String vehicleId):将车辆状态设为 Available,并打印 vehicleId returned
    • sendToMaintenance(String vehicleId):将车辆状态设为 Maintenance,并打印 vehicleId sent to maintenance
    • getAvailableVehicles():返回可用车辆列表
  • main.dart:演示你的租赁服务。创建一个 RentalService,并使用工厂添加 3 辆车:
    • 一辆汽车:V001、Toyota Camry,每天 $45
    • 一辆摩托车:V002、Honda CBR,每天 $35
    • 一辆卡车:V003、Ford F-150,每天 $75
    注册一位客户(C001、Alice Johnson),并打印客户信息。打印卡车的要求。让 Alice 租赁汽车 3 天。再尝试租赁这辆汽车(应该失败)。将摩托车送去维护。按 Available vehicles: X 的格式打印可用车辆数量。归还汽车,然后打印最终的可用车辆数量。

预期输出:

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

亲手试试

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

void main() {
  // TODO:创建一个 RentalService 实例
  
  // TODO:使用 VehicleFactory 创建并添加 3 辆车:
  // 汽车:V001,Toyota Camry,$45/天
  // 摩托车:V002,Honda CBR,$35/天
  // 卡车:V003,Ford F-150,$75/天
  
  // TODO:注册一位客户(C001,Alice Johnson)
  
  // TODO:打印客户信息
  
  // TODO:打印卡车的要求(找到卡车并调用 getRequirements())
  
  // TODO:将汽车(V001)租给 Alice(C001),租期 3 天
  
  // TODO:再次尝试出租这辆汽车(应该失败,因为它不可用)
  
  // TODO:将摩托车(V002)送去维修
  
  // TODO:按 'Available vehicles: X' 的格式打印可用车辆数量
  
  // TODO:归还汽车(V001)
  
  // TODO:输出最终可用车辆数量
}

面向对象编程中的所有课

自己练习: Dart 在线编译器