车辆租赁服务
本课属于 Coddy Dart 学习旅程的“面向对象编程”单元。第 110 课,共 110 课。
挑战
简单恭喜你来到 OOP 课程的最后一个挑战!让我们构建一个完整的车辆租赁服务,综合运用你学过的所有内容:抽象类、继承、封装、状态模式、工厂模式和泛型。
你的租赁服务将管理不同类型的车辆,跟踪车辆的可用状态,处理租赁业务,并维护客户记录。你需要将代码整理到 7 个文件中:
vehicle_state.dart:创建一个VehicleState抽象类,用于定义车辆在不同状态下的行为。包含抽象方法String getStatus()和bool canRent()。然后创建 3 个具体状态:AvailableState:返回Available,并允许租赁RentedState:返回Rented,并且不允许租赁MaintenanceState:返回In Maintenance,并且不允许租赁
vehicle.dart:创建一个抽象Vehicle类,包含finalid(String)、finalmodel(String)、带有 getter 的私有_dailyRate(double),以及一个初始值为AvailableState的私有_state(VehicleState)。包含:- 一个
statusgetter,返回状态的当前状态 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 licenseMotorcycle:租赁费用为每日租金乘以天数,再打 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 availablereturnVehicle(String vehicleId):将车辆状态设为 Available,并打印vehicleId returnedsendToMaintenance(String vehicleId):将车辆状态设为 Maintenance,并打印vehicleId sent to maintenancegetAvailableVehicles():返回可用车辆列表
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 在线编译器