好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C#实现简单的汽车租赁系统

最近学习了继承,多态,集合,设计模式,有一个汽车租凭系统,给大家分享一下:

我们首先来看看我们这个系统的效果

1.做一个项目,我们首先对项目进行分析

根据我们最近学的知识,我们可以看出继承,多态,集合,设计模式,我们都能用到

我们把所需要的类和简单模式中的[简单工厂]的工厂准备好

 类图:

01.车辆类(父类)

 

?

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

 

namespace 汽车租赁系统

{

  // 车辆类 父类

  public abstract class vehicle

  {

   //属性

   //车牌号

   public string licenseno { get ; set ; }

  

   //车名

   public string name { get ; set ; }

   //颜色

   public string color { get ; set ; }

   //使用时间

   public int rentdate { get ; set ; }

   //使用人

   public string rentuser { get ; set ; }

   //日租金

   public double dailyrent { get ; set ; }

   //还车日期

   public int returndate { get ; set ; }

 

   public vehicle() { }

   //构造

   public vehicle( string liceseno, string name, string color, int rentdate, double dailyrent)

   {

    this .color = color;

    this .dailyrent = dailyrent;

    this .licenseno = liceseno;

    this .name = name;

    this .rentdate = rentdate;

 

   }

 

   //计算价格的虚方法

   public abstract double getnum();

  

  }

}

02.子类汽车类   (继承 车辆类 父类)

 

?

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

 

namespace 汽车租凭系统

{

  //汽车类 子类

  public class car:vehicle

  {

   public car() { }

   //构造

   public car( string licenseno, string name, string color, int rentdate, double dailyrent)

    : base (licenseno, name, color, rentdate, dailyrent)

   { }

   //重写父类计算价格的方法

   public override double getnum()

   {

    //日租金*租的天数

    double result = this .dailyrent * this .returndate;

    return result;

   }

  }

}

03.子类卡车类 继承 车辆类 父类

 

?

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

 

namespace 汽车租凭系统

{

  //子类

  public class truck:vehicle

  {

   //载重

   public int load { get ; set ; }

 

   public truck() { }

 

   //构造

   public truck( string licenseno, string name, string color, int rentdate, double dailyrent, int load )

    : base (licenseno,name,color,rentdate,dailyrent )

   {

    this .load = load;

   }

 

   //重写父类计算价格的方法

   public override double getnum()

   {

    //日租金*租的天数

    double result = this .dailyrent * this .returndate;

    return result;

   }

  }

}

 04.[简单工厂]的工厂类

说这个工厂类,就是为了在新车入库的时候,可以知道它是轿车还是卡车,实例化不同的对象,方便使用

 

?

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

 

namespace 汽车租赁系统

{

  //工厂类

  public class vehiclefactory

  {

   //带参静态方法

   public static vehicle carteshow( string liceseno, string name, string color, int rentdate, double dailyrent, int load, string type)

   {

    //初始化父类对象

    vehicle vehicle = null ;

    switch (type)

    {

     //根据传来的值,实例化对应的对象

     case "卡车" :

      vehicle = new truck(liceseno, name, color, rentdate, dailyrent, load);

      break ;

     case "轿车" :

      vehicle = new car(liceseno, name, color, rentdate, dailyrent);

      break ;

    }

    //返回实例化对象

    return vehicle;

  

  

   }

  }

}

2. 剩下的就是对主窗体的功能进行实现

其实租车和还车的核心就是两个集合之间的交互

新车入库就是使用[简单工厂]的设计模式进行对应添加

其中有个我们以前没见过的控件tabcontrol

 

?

using system;

using system.collections.generic;

using system测试数据ponentmodel;

using system.data;

using system.drawing;

using system.linq;

using system.text;

using system.threading.tasks;

using system.windows.forms;

 

 

namespace 汽车租赁系统

{

  public partial class frmmain : form

  {

   public frmmain()

   {

    initializecomponent();

   }

   //保存可租车辆的集合

   dictionary< string , vehicle> vehicles= new dictionary< string ,vehicle>();

   //保存租出车的集合

   dictionary< string , vehicle> rentvehicles= new dictionary< string ,vehicle>();

 

   //动态加载listview的方法

   public void new (dictionary< string ,vehicle> list,listview lvlist)

   {

    listviewitem listview = null ;

    lvlist.items.clear();

    foreach (vehicle item in list.values)

    {

     if (item is car)

     {

      listview = new listviewitem();

      listview.text = item.licenseno;

      listview.subitems.add(item.name);

      listview.subitems.add(item.color);

      listview.subitems.add(item.rentdate.tostring());

      listview.subitems.add(item.dailyrent.tostring());

     }

     else if (item is truck)

     {

      listview = new listviewitem();

      listview.text = item.licenseno;

      listview.subitems.add(item.name);

      listview.subitems.add(item.color);

      listview.subitems.add(item.rentdate.tostring());

      listview.subitems.add(item.dailyrent.tostring());

      listview.subitems.add(((truck)item).load.tostring());

     }

     lvlist.items.add(listview);

    }

   

   }

 

   //准备可租车辆

   public void intitle()

   {

   

    truck truck = new truck( "京a111" , "奥迪" , "红色" ,3,240,10);

    car car = new car( "京a222" , "宝马" , "黑色" , 3, 240);

 

    vehicles.add(truck.licenseno,truck);

    vehicles.add(car.licenseno, car);

    //加载数据

    new (vehicles,lvlist);

   

   }

   private void frmmain_load( object sender, eventargs e)

   {

    intitle();

   }

   //点击租车触发的事件

   private void btn_zu_click( object sender, eventargs e)

   {

    if (lvlist.selecteditems.count==0)

   

    {

     messagebox.show( "请选中一行!" );

     return ;

    }

    if (txt_name.text== "" )

    {

     messagebox.show( "请输入姓名!" );

     return ;

 

    }

    //执行租车.

    //获取车牌号的值

    string carnum = lvlist.selecteditems[0].text;

    vehicle ve= vehicles[carnum];

 

    //直接把获得要租的信息放入rentvehicles集合

 

    rentvehicles.add(carnum,ve);

 

    //删除原来的集合

    vehicles.remove(carnum);

 

    //重新加载

    new (vehicles,lvlist);

    messagebox.show( "租车成功" );

 

   }

 

   private void button1_click( object sender, eventargs e)

   {

    //加载已出租车辆信息

    new (rentvehicles,lvlist_huan);

   

   }

 

   private void btn_ji_click( object sender, eventargs e)

   {

    if (txt_day.text== "" )

    {

     messagebox.show( "请输入天数" );

     return ;

    }

 

    if (lvlist_huan.selecteditems.count==0)

    {

     messagebox.show( "请选择一行" );

     return ;

    }

    //获取车牌号的值

    string carnum1 = lvlist_huan.selecteditems[0].text;

    vehicle ve = rentvehicles[carnum1];

 

  

    //获取租的天数

    int num = convert.toint32(txt_day.text);

    ve.returndate = num;

    double money=ve.getnum();

    dialogresult result= messagebox.show( "你要支付" +money+ "元" , "提示" ,messageboxbuttons.okcancel,messageboxicon.question);

    if (result==dialogresult.ok)

    {

     //直接把获得要还的信息放入vehicles集合

     vehicles.add(carnum1, ve);

 

     //删除原来的集合

     rentvehicles.remove(carnum1);

 

     //重新加载

     new (rentvehicles, lvlist_huan);

     messagebox.show( "还车成功" );

    }

   

 

   }

   //刷新按钮

   private void btn_new_click( object sender, eventargs e)

   {

    //重新加载

    new (vehicles, lvlist);

   }

   //判断填写是否正确的方法

   public bool good()

   {

    bool flag = true ;

    if (txt_id.text== "" ||txt_xing.text== "" ||cmb_color.text== "" ||txt_time.text== "" ||txt_money.text== "" ||txt_zhong.text== "" || rdb_jiao.text== "" )

    {

     flag = false ;

 

    }

    return flag;

   }

   //入库按钮点击事件

   private void btn_ruku_click( object sender, eventargs e)

   {

    if (good()) //判断填写是否正确

    {

 

     foreach ( string item in vehicles.keys)

     {

      if (txt_id.text==item)

      {

       messagebox.show( "此车牌已经有库存了,请你确认!" );

       return ;

      }

     }

     //使用"简单工厂"

     vehicle ve = null ;

     if (rdb_jiao. checked == true )

     {

      ve = vehiclefactory.carteshow(txt_id.text, txt_xing.text, cmb_color.text,convert.toint32(txt_time.text), convert.todouble(txt_money.text), convert.toint32(txt_zhong.text), rdb_jiao.text);

 

     }

     else

     {

      ve = vehiclefactory.carteshow(txt_id.text, txt_xing.text, cmb_color.text, convert.toint32(txt_time.text), convert.todouble(txt_money.text), convert.toint32(txt_zhong.text), rdb_ka.text);

 

     }

     //添加集合

     vehicles.add(txt_id.text, ve);

     messagebox.show( "入库成功" );

 

     //清空所要填的值选项

     txt_id.text= "" ;

     txt_xing.text= "" ;

     cmb_color.text= "" ;

     txt_time.text= "" ;

     txt_money.text= "" ;

     txt_zhong.text = "" ;

    }

    else

    {

 

     messagebox.show( "请完善信息的填写!" );

    }

   

 

   }

   //选择不同的按钮

   private void rdb_jiao_checkedchanged( object sender, eventargs e)

   {

    if (rdb_jiao. checked == true )

    {

     lab_zhong.forecolor = color.red;

     txt_zhong.enabled = false ;

    }

    else

    {

     lab_zhong.forecolor = color.black;

     txt_zhong.enabled = true ;

    }

   }

  }

}

我们来分类看看其中的魅力代码:

1.租车的界面功能

01.租车按钮 

 

?

//点击租车触发的事件

   private void btn_zu_click( object sender, eventargs e)

   {

    //确保选中一行

    if (lvlist.selecteditems.count==0)

   

    {

     messagebox.show( "请选中一行!" );

     return ;

    }

    //确保有人租车

    if (txt_name.text== "" )

    {

     messagebox.show( "请输入姓名!" );

     return ;

 

    }

    //执行租车.

    //获取车牌号的值

    string carnum = lvlist.selecteditems[0].text;

    //根据车牌号获得此车对象

    vehicle ve= vehicles[carnum];

 

    //直接把获得要租的信息放入rentvehicles集合

 

    rentvehicles.add(carnum,ve);

 

    //删除原来的集合

    vehicles.remove(carnum);

 

    //重新加载

    new (vehicles,lvlist);

    messagebox.show( "租车成功" );

02.刷新按钮

?

//刷新按钮

   private void btn_new_click( object sender, eventargs e)

   {

    //重新加载

    new (vehicles, lvlist);

   }

这里的刷新定义了一个方法,也就是动态加载listview的方法(nuw方法)

这个方法有两个参数,第一个参数传入车辆类型集合对象,第二个传入listview的名字

这样的作用就是在租车和还车时都能使用此方法进行刷新,岂不妙哉!

?

//动态加载listview的方法

  public void new (dictionary< string ,vehicle> list,listview lvlist)

  {

   //初始化listviewitem对象

   listviewitem listview = null ;

    //清除listview,以免有冲突的值

   lvlist.items.clear();

   foreach (vehicle item in list.values)

   {

    //判断赋值

    if (item is car)

    {

     listview = new listviewitem();

     listview.text = item.licenseno;

     listview.subitems.add(item.name);

     listview.subitems.add(item.color);

     listview.subitems.add(item.rentdate.tostring());

     listview.subitems.add(item.dailyrent.tostring());

    }

    else if (item is truck)

    {

     listview = new listviewitem();

     listview.text = item.licenseno;

     listview.subitems.add(item.name);

     listview.subitems.add(item.color);

     listview.subitems.add(item.rentdate.tostring());

     listview.subitems.add(item.dailyrent.tostring());

     listview.subitems.add(((truck)item).load.tostring());

    }

    //关联

    lvlist.items.add(listview);

   }

  

  }

2.还车的界面功能

01.选择结算按钮

 

?

private void btn_ji_click( object sender, eventargs e)

  {

   //确保 是否输入天数

   if (txt_day.text== "" )

   {

    messagebox.show( "请输入天数" );

    return ;

   }

   //确保是否选中一行

   if (lvlist_huan.selecteditems.count==0)

   {

    messagebox.show( "请选择一行" );

    return ;

   }

   //获取车牌号的值

   string carnum1 = lvlist_huan.selecteditems[0].text;

    //根据车牌号获得对应的车辆对象

   vehicle ve = rentvehicles[carnum1];

 

   //获取租的天数

   int num = convert.toint32(txt_day.text);

   //给属性使用天数赋值

   ve.returndate = num;

   //调用计算方法(多态的应用)

   double money=ve.getnum();

   dialogresult result= messagebox.show( "你要支付" +money+ "元" , "提示" ,messageboxbuttons.okcancel,messageboxicon.question);

   if (result==dialogresult.ok)

   {

    //直接把获得要还的信息放入vehicles集合

    vehicles.add(carnum1, ve);

 

    //删除原来的集合

    rentvehicles.remove(carnum1);

 

    //重新加载

    new (rentvehicles, lvlist_huan);

    messagebox.show( "还车成功" );

   }

  

 

  }

02.刷新按钮(调用租车时写的方法)

?

private void button1_click( object sender, eventargs e)

   {

    //加载已出租车辆信息

    new (rentvehicles,lvlist_huan);

   

   }

3.新车入库界面功能

01.入库按钮

?

//入库按钮点击事件

  private void btn_ruku_click( object sender, eventargs e)

  {

   if (good()) //判断填写是否正确

   {

     //车牌号是唯一的,不能重复添加已有的车牌号

    foreach ( string item in vehicles.keys)

    {

     if (txt_id.text==item)

     {

      messagebox.show( "此车牌已经有库存了,请你确认!" );

      return ;

     }

    }

    //使用"简单工厂",进行对应添加

    vehicle ve = null ;

    if (rdb_jiao. checked == true )

    {

     ve = vehiclefactory.carteshow(txt_id.text, txt_xing.text, cmb_color.text,convert.toint32(txt_time.text), convert.todouble(txt_money.text), convert.toint32(txt_zhong.text), rdb_jiao.text);

 

    }

    else

    {

     ve = vehiclefactory.carteshow(txt_id.text, txt_xing.text, cmb_color.text, convert.toint32(txt_time.text), convert.todouble(txt_money.text), convert.toint32(txt_zhong.text), rdb_ka.text);

 

    }

    //添加集合

    vehicles.add(txt_id.text, ve);

    messagebox.show( "入库成功" );

 

    //清空所要填的值选项

    txt_id.text= "" ;

    txt_xing.text= "" ;

    cmb_color.text= "" ;

    txt_time.text= "" ;

    txt_money.text= "" ;

    txt_zhong.text = "" ;

   }

   else

   {

 

    messagebox.show( "请完善信息的填写!" );

   }

  

 

  }

以上就是本文的全部内容,希望对大家的学习有所帮助。

dy("nrwz");

查看更多关于C#实现简单的汽车租赁系统的详细内容...

  阅读:40次