案例功能要求:



实现代码:
1.MOTOVehicle类: 机动车抽象类
cs
namespace _01_汽车租赁系统
{
/// <summary>
/// 机动车抽象类,作为所有车辆类的基类
/// 包含了所有车辆共有的属性和行为
/// </summary>
public abstract class MOTOVehicle
{
// 私有字段,封装车辆的核心属性
private string _no;// 汽车车牌号
private string _color;// 汽车颜色
private double _mileAge;// 汽车公里数
private string _brand;// 汽车品牌
// 公共属性,提供对私有字段的安全访问
public string Brand { get { return _brand; } set { _brand = value; } }
public string Color { get { return _color; } set { _color = value; } }
public string No { get { return _no; } set { _no = value; } }
public double MileAge { get { return _mileAge; } set { _mileAge = value; } }
/// <summary>
/// 无参构造函数
/// </summary>
public MOTOVehicle() { }
/// <summary>
/// 带参构造函数,用于初始化车辆的所有基本属性
/// </summary>
/// <param name="no">车牌号</param>
/// <param name="color">颜色</param>
/// <param name="mileAge">行驶里程</param>
/// <param name="brand">品牌</param>
public MOTOVehicle(string no, string color, double mileAge, string brand)
{
_no = no;
_color = color;
_mileAge = mileAge;
_brand = brand;
}
/// <summary>
/// 抽象方法:计算租金
/// 所有子类必须实现自己的租金计算逻辑
/// </summary>
/// <param name="day">租赁天数</param>
/// <returns>返回计算出的租金</returns>
public abstract double GetCalRent(int day);
// 静态Random对象,用于生成随机车牌号
// 静态成员在所有类实例间共享,确保随机数的唯一性
static Random random = new Random();
/// <summary>
/// 静态方法:生成一个随机的车牌号
/// </summary>
/// <returns>返回生成的车牌号字符串</returns>
public static string GetNO()
{
// 省份/直辖市简称数组
string[] provinceAbbr =
{
"京", "沪", "津", "渝", "冀", "晋", "蒙", "辽", "吉", "黑",
"苏", "浙", "皖", "闽", "赣", "鲁", "豫", "鄂", "湘", "粤",
"桂", "琼", "川", "黔", "滇", "陕", "甘", "青", "宁", "新",
"港", "澳", "台"
};
// 随机选择一个省份简称
string no = provinceAbbr[random.Next(provinceAbbr.Length)];
// 城市代号字母数组
string[] firstLetter = { "A", "B", "C", "D", "E", "F", "G", "N", "K", "S", "P" };
// 随机选择一个城市代号
no += firstLetter[random.Next(firstLetter.Length)];// 0~firstLetter.Length-1
// 车牌号后五位字符池(大写字母 + 数字)
char[] charPool = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".ToCharArray();
// 随机生成后五位
for (int i = 0; i < 5; i++)
{
// 从字符池中随机选择一个字符
no += charPool[random.Next(charPool.Length)];
}
return no;// 把拼接好的车牌号返回
}
}
}
2.Car类: 轿车类
cs
namespace _01_汽车租赁系统
{
/// <summary>
/// 轿车类,继承自MOTOVehicle抽象类
/// 代表具体的轿车类型
/// </summary>
public class Car : MOTOVehicle
{
// 私有字段:车型(如 "550i", "商务舱GL8")
private string _type;
/// <summary>
/// 公共属性:车型
/// </summary>
public string Type { get { return _type; } set { _type = value; } }
/// <summary>
/// 无参构造函数
/// </summary>
public Car() : base() { }
/// <summary>
/// 带参构造函数,用于初始化轿车的所有属性
/// </summary>
/// <param name="no">车牌号</param>
/// <param name="color">颜色</param>
/// <param name="mileAge">行驶里程</param>
/// <param name="brand">品牌</param>
/// <param name="type">车型</param>
public Car(string no, string color, double mileAge, string brand, string type) : base(no, color, mileAge, brand)
{
_type = type;
}
/// <summary>
/// 重写父类的抽象方法:计算轿车租金
/// 根据不同的车型制定不同的日租金
/// </summary>
/// <param name="day">租赁天数</param>
/// <returns>返回计算出的租金</returns>
public override double GetCalRent(int day)
{
// 根据车型判断日租金
if ("商务舱GL8".Equals(_type))
{
return 600 * day;
}
else if ("550i".Equals(_type))
{
return 500 * day;
}
else if ("林荫大道".Equals(_type))
{
return 300 * day;
}
// 如果车型未知,返回0或抛出异常
return 0;
}
}
}
3.Bus类: 客车类
cs
namespace _01_汽车租赁系统
{
/// <summary>
/// 客车类,继承自MOTOVehicle抽象类
/// 代表具体的客车类型
/// </summary>
public class Bus : MOTOVehicle
{
// 私有字段:座位数
private int _seatCount;
/// <summary>
/// 公共属性:座位数
/// </summary>
public int SeatCount { get { return _seatCount; } set { _seatCount = value; } }
/// <summary>
/// 无参构造函数
/// </summary>
public Bus() : base() { }
/// <summary>
/// 带参构造函数,用于初始化客车的所有属性
/// </summary>
/// <param name="no">车牌号</param>
/// <param name="color">颜色</param>
/// <param name="mileAge">行驶里程</param>
/// <param name="brand">品牌</param>
/// <param name="seatCount">座位数</param>
public Bus(string no, string color, double mileAge, string brand, int seatCount) : base(no, color, mileAge, brand)
{
_seatCount = seatCount;
}
/// <summary>
/// 重写父类的抽象方法:计算客车租金
/// 根据座位数将客车分为两档,制定不同的日租金
/// </summary>
/// <param name="day">租赁天数</param>
/// <returns>返回计算出的租金</returns>
public override double GetCalRent(int day)
{
// 座位数小于等于16座,日租金800元
if (_seatCount <= 16)
{
return 800 * day;
}
// 座位数大于16座,日租金1500元
else
{
return 1500 * day;
}
}
}
}
4. FactoryVehicle类: 汽车工厂类
cs
namespace _01_汽车租赁系统
{
/// <summary>
/// 车辆工厂类
/// 负责根据客户端的需求(类型)创建相应的车辆对象
/// 采用简单工厂模式,封装了对象创建的逻辑
/// </summary>
public class FactoryVehicle
{
/// <summary>
/// 静态工厂方法,用于获取车辆实例
/// </summary>
/// <param name="selectType">选择的车辆类型 (1: 轿车, 2: 客车)</param>
/// <returns>返回创建的MOTOVehicle类型对象</returns>
public static MOTOVehicle GetInstance(int selectType)
{
// 根据传入的类型参数,创建并返回对应的车辆对象
if (selectType == 1)
{
return new Car();
}
else if (selectType == 2)
{
return new Bus();
}
// 如果类型无效,返回null
return null;
}
}
}
5.Program类: 主程序类
cs
namespace _01_汽车租赁系统
{
/// <summary>
/// 主程序类
/// 包含应用程序的入口点 Main 方法,负责整个租赁流程的控制和用户交互
/// </summary>
internal class Program
{
/// <summary>
/// 应用程序入口点
/// </summary>
/// <param name="args">命令行参数</param>
static void Main(string[] args)
{
try
{
Console.WriteLine("欢迎您来到汽车租赁公司!");
Console.WriteLine("请输入要租赁的天数:");
int day = int.Parse(Console.ReadLine());
Console.WriteLine("请输入要租赁的汽车类型(1:轿车 2、客车):");
int selectType = int.Parse(Console.ReadLine());// 1->Car 2->Bus
// 使用工厂模式创建车辆对象
MOTOVehicle vehicle = FactoryVehicle.GetInstance(selectType);
// 检查车辆对象是否创建成功
if (vehicle == null)
{
Console.WriteLine("请选择正确的车型!");
return;
}
//根据不同的车辆类型,进行相应的属性设置
switch (selectType)
{
case 1: // 如果是轿车
// 获取轿车品牌
Console.WriteLine("请输入要租赁的汽车品牌(1.宝马 2、别克):");
int carBrandChoice = int.Parse(Console.ReadLine());
string carBrand = carBrandChoice == 1 ? "宝马" : "别克";
//根据品牌获取具体车型
Console.WriteLine(carBrandChoice == 1
? "请输入轿车的型号:1、550i"
: "请输入轿车的型号:1、商务舱GL8 2、林荫大道");
int carModelChoice = int.Parse(Console.ReadLine());
string carModel = string.Empty;
if (carBrand == "宝马")
{
carModel = "550i";
}
else if (carBrand == "别克")
{
carModel = carModelChoice == 1 ? "商务舱GL8" : "林荫大道";
}
// 将车辆对象转换为Car类型,并设置其属性
Car car = (Car)vehicle;
car.Brand = carBrand;
car.Type = carModel;
break;
case 2: // 如果是客车
//获取客车品牌
Console.WriteLine("请输入要租赁的客车品牌:(1、金杯 2、金龙)");
int busBrandChoice = int.Parse(Console.ReadLine());
string busBrand = busBrandChoice == 1 ? "金杯" : "金龙";
// 获取客车型号
Console.WriteLine("请输入客车的座位数:");
int seatCount = int.Parse(Console.ReadLine());
//将车辆对象转换为Bus类型,并设置其属性
Bus bus = (Bus)vehicle;
bus.Brand = busBrand;
bus.SeatCount = seatCount;
break;
}
// 计算租金
// 这里体现了多态性:调用的是具体子类(Car或Bus)中重写的GetCalRent方法
double rentMoney = vehicle.GetCalRent(day);
// 输出最终结果
Console.WriteLine("分配给您的汽车牌号是: " + MOTOVehicle.GetNO());
Console.WriteLine($"顾客您好!您租赁的是 {vehicle.Brand},需要支付的租赁费用是: {rentMoney} 元。");
}
catch (FormatException)
{
Console.WriteLine("输入格式错误,请输入有效的数字!");
}
catch (Exception ex)
{
Console.WriteLine($"程序运行出错: {ex.Message}");
}
}
}
}
6.测试演示

希望对大家有所帮助。感谢大家的关注和点赞。