综合实例:使用多态完善汽车租赁系统计价功能

主讲教师:王少华      QQ群号:483773664

学习目标

  1. 在案例中应用多态;

  2. 使用父类类型作为方法的形参

一、计算一次租赁多辆汽车的总租金

(一) 需求说明

在前一章(继承)汽车租赁系统的基础上,即已经实现了汽车租赁系统的简单计价功能,客户可以租赁一辆某种型号的汽车若干天。现在要增加需求:

客户可以一次租赁多辆不同品牌的不同型号的汽车若干天,要求计算出总租赁价。

假设有一客户要租赁:

  1. 2辆宝马

  2. 1辆别克商务舱

  3. 1辆金龙(34)座

  4. 租5天共多少租金?

(二)效果图


(三)训练要点

  1. 多态的使用

  2. 使用父类类型作为方法参数

(四)实现思路

1、在测试类中,创建车的对象,放在数组中

1
2
3
4
5
MotoVehile[] motos = new MotoVehile[4];
motos[0] = new Car("宝马550i","京NY28588");
motos[1] = new Car("宝马550i","京NNN328");
motos[2] = new Car("别克林荫大道","京NY28588");
motos[3] = new Bus("金龙",34);

2、新建一个顾客类,在其中添加一个calcTotalRent(MotoVehile[] motos,int days),循环调用calcRent()方法,计算总租金

1
2
3
4
5
6
7
public int calcTotalRent(MotoVehile[] motos,int days){
       int totalRent = 0;
       for(int i=0;i<motos.length;++i){
            totalRent += motos[i].calRent(days);
       }
       return totalRent;
}

(五)参考代码

1 Customer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
 *
 * @author wangsh
 * @createDate:2016年4月14日
 * 功能描述:顾客类
 */
public class Customer {
    String id;//客户编号
    String name;//客户姓名 
    /**
     * 有参构造方法。
     * @param id 客户编号
     * @param name 客户姓名
     */
    public Customer(String id, String name) {
        this.id=id;
        this.name=name;
    }
    public String getId() {
        return id;
    }
    public String getName() {
        return name;
    }
    /**
     * 计算多辆汽车总租赁价格 
     */
    public int calcTotalRent(MotoVehicle motos[],int days){
        int sum=0;
        for(int i=0;i<motos.length;i++)
            sum+=motos[i].calRent(days);
        return sum;
    }
}

2 TestRent

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class TestRent {
    public static void main(String[] args) {
        int days;// 租赁天数
        int totalRent;// 总租赁费用
        //1、客户租赁的多辆汽车信息及租赁天数
        MotoVehicle motos[] = new MotoVehicle[4];
        motos[0] = new Car("京NY28588", "宝马", "550i");
        motos[1] = new Car("京NNN3284", "宝马", "550i");
        motos[2] = new Car("京NT43765", "别克", "林荫大道");
        motos[3] = new Bus("京5643765", "金龙", 34);      
        days = 5;
        //2、计算总租赁费用
        Customer customer= new Customer("s070537", "沈伟");
        totalRent = customer.calcTotalRent(motos, days);
        // 输出客户姓名和总租赁费用
        System.out.println("汽车牌号\t\t汽车品牌");
        for(int i=0;i<motos.length;i++){
            System.out.println(motos[i].getNo()+"\t"+motos[i].getBrand());
        }
        System.out.println("\n客户名:" + customer.getName()+",租赁天数:"+days
                + ",租赁总费用:" + totalRent+"。");
    }
}

完整代码见附件case1

二、增加租赁卡车业务,计算汽车租赁的总租金

(一)需求说明

汽车租赁公司业务扩大,增加了卡车业务,租赁费用以吨位计算,每吨每天计价50元。要求对系统进行扩展,计算汽车租赁总租金。

(二)运行效果图


(三)训练要点

  1. 使用父类作为方法形参实现多态

  2. 使用多态增强系统的扩展性和可维护性

(四)实现思路

  1. 在前面代码的基础上进行修改

  2. 创建卡车类,实现calcRent ()方法

  3. 修改统计租金代码 

(五)参考代码

1、卡车类

1
2
3
4
5
6
7
8
9
10
public class Truck extends MotoVehicle {
    int tonnage;// 吨位
...
    /**
     * 计算卡车租赁价
     */
    public int calRent(int days) {
        return tonnage * 50 * days;
    }
}

2 TestRent

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class TestRent {
    public static void main(String[] args) {
        int days;// 租赁天数
        int totalRent;// 总租赁费用
        //1、客户租赁的多辆汽车信息及租赁天数
        MotoVehicle motos[] = new MotoVehicle[5];
        motos[0] = new Car("京NY28588", "宝马", "550i");
        motos[1] = new Car("京NNN3284", "宝马", "550i");
        motos[2] = new Car("京NT43765", "别克", "林荫大道");
        motos[3] = new Bus("京5643765", "金龙", 34);
        motos[4] = new Truck("京GD56577", "解放", 30);
        days = 5;
        //2、计算总租赁费用
        Customer customer= new Customer("s070537", "沈伟");
        totalRent = customer.calcTotalRent(motos, days);
        // 输出客户姓名和总租赁费用
        System.out.println("汽车牌号\t\t汽车品牌");
        for(int i=0;i<motos.length;i++){
            System.out.println(motos[i].getNo()+"\t"+motos[i].getBrand());
        }
        System.out.println("\n客户名:" + customer.getName()+",租赁天数:"+days
                + ",租赁总费用:" + totalRent+"。");
    }

}


详细代码见附件case2

三、扩展

学有余力的同学,可以对此系统进行进一步优化

1. 循环从控制台选择汽车种类

2. 从控制台输入天数

3. 累加计算总租金