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

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

相关推荐
翔云 OCR API10 小时前
发票查验接口详细接收参数说明-C#语言集成完整示例-API高效财税管理方案
开发语言·c#
虫小宝11 小时前
高佣金的返利平台性能压测:从单接口到全链路的性能瓶颈分析
c#·linq
故事不长丨12 小时前
C#集合:解锁高效数据管理的秘密武器
开发语言·windows·c#·wpf·集合·winfrom·字典
驭白.12 小时前
不止于自动化:新能源汽车智造的数字基座如何搭建?
大数据·人工智能·自动化·汽车·数字化转型·制造业
雨大王51214 小时前
工业AI大模型优化汽车生产排产:技术原理与实践案例
人工智能·汽车
jghhh0114 小时前
基于C#实现与三菱FX系列PLC串口通信
开发语言·算法·c#·信息与通信
故事不长丨14 小时前
C#队列深度剖析:解锁高效编程的FIFO密码
visualstudio·c#·wpf·多线程·winfrom·队列·queue
应用市场14 小时前
图片格式完全指南——从JPEG到AVIF的技术原理与选型
网络·人工智能·安全·汽车
云和数据.ChenGuang14 小时前
openGauss赋能新能源汽车智能制造——比亚迪MES系统数据库国产化升级案例
数据库·汽车·opengauss·gaussdb·数据库权限管理
雨大王51214 小时前
工业AI大模型如何重塑汽车焊接与质检流程?
人工智能·汽车