🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 1.1 **项目目标** **1.1.1 知识目标** (1)能理解面向对象思想,掌握类的编写方法 (2)能理解并会使用面向对象的特性——封装、继承、多态 (3)会使用面向对象三大特征编写程序 **1.1.2 能力目标** (1)能够使用面向对象的思想思考现实问题 (2)能够对现实世界的事物进行抽象与归类 (3)能够灵活采用访问修饰符修饰类的属性和方法,达到信息封装的目的 (4)能够通过继承的方式,描述问题中的实际关系并设计父类和子类 (5)能够通过重载和重写实现程序中的多态 **1.1.3 素养目标** (1)明确类的设计规范,类的命名规范,属性的命名规范,方法的命名规范 (2)能够就封装继承多态的三大特性,以面向对象的思维方式思考程序要解决的问题 ### 1.2 **案例描述** &emsp;&emsp;使用面向对象实现租车系统,系统用户需要完成车辆租赁的操作,并进行租金结算记录。 需求说明: &emsp;&emsp;汽车租赁系统,有两种车,分别是轿车和客车,所以需要设计两个类,轿车类和客车类,这两个类都要继承自共同的父类,汽车类。使用面向对象实现租车系统,系统用户需要完成车辆租赁的操作,并进行租金结算记录。汽车的租赁信息如下表所示: ![](http://h.yiniuedu.com/8498197ec6e9c7618941c0ad3c743ecf) ### 1.3 **实现效果** ![](http://h.yiniuedu.com/831e707df01390117d17822148490024)![](http://h.yiniuedu.com/ccd23381304d992326d856a98a37d8ed) ### 1.4 **知识点** 本实训项目涉及到的知识点如下: &emsp;&emsp;类和对象 &emsp;&emsp;继承、封装和多态 &emsp;&emsp;方法的重写和重载 ### 1.5 **案例分析** #### **1.5.1 功能划分** &emsp;&emsp;系统基本模块包括: ![](http://h.yiniuedu.com/b130437d780fae29dd268add5aea0b98) #### **1.5.2 概要设计** &emsp;&emsp;类和属性 汽车类:车牌号、品牌、日租金 客车类:车牌号、品牌、日租金、座位数 轿车类:车牌号、品牌、日租金、型号 汽车业务类:汽车类数组、轿车类数组 汽车租赁管理类:忽略 &emsp;&emsp;首先我们先来看看谁是父类,谁是子类,根据类和属性,我们知道汽车类有:车牌号、品牌、日租金。轿车类有:车牌号、品牌、型号、日租金。客车类有:车牌号、品牌、日租金、座位数等这些参数。那么我们可以发现轿车类和客车类他们共有的属性是车牌号、品牌和日租金,我们就可以把车牌号、品牌和日租金这三个属性提取到父类中去,也就是汽车类中,租金我们搞一个方法。那么此时轿车类和客车只用去继承父类就可以。 #### **1.5.3 详细设计** ![](http://h.yiniuedu.com/6902a77b50a154ea9b075c0d6e7ac000) ### 1.6 **实现要点** 租车系统设计与实现,请参照编码命名规范进行设计与实现。 项目名称:CarRentalSystem 包名称:com.yiniuedu.cms.rental 1.定义抽象父类Vehicle类,包含一个抽象方法,计算租金的方法public abstract double calRent(int days);。 2.定义Car类,属性车牌号、品牌、日租金继承自父类,特有属性型号。方法有:重新父类计算租金的方法。 3.定义Bus类,属性车牌号、品牌、日租金继承自父类,特有属性座位数。方法有:重新父类计算租金的方法。 4.定义VehicleBusiness类,有轿车数组和客车数组。有初始化轿车和客车数组的方法,有租轿车和租客车的方法。 5.编写测试类TestVehicle类,通过系统界面提示完成租车业务并计算租金。 ### 1.7 **重难点解析** 类的抽象和编写 封装、继承、多态的用法 方法的重载与重写 ### 1.8 **关键代码** ``` //轿车租金的计算方法 public double calRent(int days) {   double price = getDataRent() * days;   // 折扣计算   if (days > 7 && days <= 30) {    price *= 0.9;   } else if (days > 30 && days <= 150) {    price *= 0.8;   } else if (days > 150) {    price *= 0.7;   }   return price;  } //租车业务类里面租车的两个方法 // 租轿车  public Car rentCar(String brand, String type) {   Car c = null;   for (Car car : car) {    if (car.getBrand().equals(brand) && car.getCarType().equals(type)) {     c = car;     break;    }   }   return c;  }  // 租客车  public Bus rentBus(String brand, int seatNum) {   Bus b = null;   for (Bus bus : bus) {    if (bus.getBrand().equals(brand) && bus.getSeatNum() == seatNum) {     b = bus;     break;    }   }   return b;  } ``` ### 1.9 **案例总结** &emsp;&emsp;在进行基于面向对象思想的编程时,需求描述中的名词,就是属性,动词就是方法。还要充分利用继承、封装和多态的思想,使代码更加简洁,更加易于修改,增强代码的可读性。 &emsp;&emsp;如果加入新的车型,大家思考如何实现,有没有更好的办法实现。 ### **练习任务** 现有新的需求,要求加入新的车型:货车,货车有实际载重量。大家根据课上学习内容,完成货车租车业务和租金的计算。 货车(Truck),载重量(capacity) <table> <tr> <td>车型</td> <td>具体信息</td> <td>日租金</td> <td>折扣</td> </tr> <tr> <td rowspan="4">货车</td> <td>解放 35吨 (鲁Q88888) </td> <td>5000</td> <td rowspan="4">大于3天9折</br>大于7天8折</br>大于30天7折</br>大于180天6折</td> </tr> <tr> <td >解放 25吨 (鲁Q99999)</td> <td >4500</td> </tr> <tr> <td >威铃 10吨 (鲁Q77777)</td> <td >3500</td> </tr> <tr> <td >威铃 8吨 (鲁Q66666)</td> <td >3000</td> </tr> </table> 代码获取请加微信:yiniujiaoyu