C#小案例-->汽车租聘系统计价功能

案例功能要求:

实现代码:

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.测试演示

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

相关推荐
MM_MS1 小时前
WinForm+C#小案例--->爱心跑马灯演示
开发语言·c#·visual studio
福尔摩斯张2 小时前
C语言核心:string函数族处理与递归实战
c语言·开发语言·数据结构·c++·算法·c#
qq_353199254 小时前
鼠标滑动或横拉用户控件无闪缩
c#
虎头金猫4 小时前
随时随地处理图片文档!Reubah 加cpolar的实用体验
linux·运维·人工智能·python·docker·开源·visual studio
Rainmicro5 小时前
TC387——MPU简介
汽车
七七墨染16 小时前
DotMemory系列:5. 如何实现自动化抓取和应用自托管
运维·c#·自动化
王家羽翼-王羽17 小时前
C# 连接 PLC 的S7西门子协议读写,样例分享
c#
斯内科17 小时前
C#进行CAN【控制器局域网】通讯
c#·can·pcanbasic.net
深兰科技18 小时前
智融无界·浦绘未来|深兰科技受邀出席“2025浦东新区产业智能化创新发展年度活动”,陈海波发表主旨演讲
人工智能·jupyter·vim·intellij-idea·postman·visual studio·深兰科技