Skip to content

Java06-面向对象进阶

在每个周的星期四,你会去肯德基“疯狂”一回吗?

如果你吃过快餐,那么一定使用过小程序点单。顾客在小程序中选择菜品下单,后台就能收到并着手制作,从顾客选择菜品,支付订单,后台收到订单,菜品最终送到顾客桌上,订单结束,整个过程由下单系统全程管理订单的生命周期。

那么我们现在就来开一个虚拟快餐店吧!注意:该情景仅仅为了帮助理解面向对象编程,并无实际应用价值。

Task1.继承

首先我们为每个菜品写一个类,比如:

public class Dish_0 {
    private String name;//菜品名称
    private double price;//菜品价格

    public void profile(){
        System.out.println("番茄炒蛋是普通的大众菜肴,烹调方法比较简单,而且营养搭配合理。色泽鲜艳,口味宜人,深受大众喜爱。其营养价值丰富,具有营养素互补的特点以及健美抗衰老的作用。番茄含有丰富的胡萝卜素、维生素C和B族维生素,番茄红素具有独特的抗氧化能力。鸡蛋含有大量的维生素和矿物质及有高生物价的蛋白质。蛋黄中含有丰富的卵磷脂、固醇类等,对神经系统和身体发育有非常好的作用,深受人们的喜爱。");
    }

    Dish_0(String name,double price{
        this.name = "番茄炒蛋";
        this.price = 10;
    };
}
public class Dish_0 {
    private String name;//菜品名称
    private double price;//菜品价格

    public void profile(){
        System.out.println("番茄炒蛋是普通的大众菜肴,烹调方法比较简单,而且营养搭配合理。色泽鲜艳,口味宜人,深受大众喜爱。其营养价值丰富,具有营养素互补的特点以及健美抗衰老的作用。番茄含有丰富的胡萝卜素、维生素C和B族维生素,番茄红素具有独特的抗氧化能力。鸡蛋含有大量的维生素和矿物质及有高生物价的蛋白质。蛋黄中含有丰富的卵磷脂、固醇类等,对神经系统和身体发育有非常好的作用,深受人们的喜爱。");
    }

    Dish_0(String name,double price{
        this.name = "番茄炒蛋";
        this.price = 10;
    };
}

这个菜品类Dish_0的属性有菜品名称,菜品价格,有一个构造方法,还有一个cook方法

要开一个快餐店,菜单上肯定要准备很多菜品,也就要准备很多个菜品类,这些菜品类都有相同的属性,难道我们每添加一个菜品类都需要写这么多代码吗?

  1. 请你了解Java的继承机制,编写Dish作为基类,包含上面类的属性和方法,然后编写两个类Dish_1和Dish_2继承这个基类,并在菜品类的构造方法里把菜品名字和价格写好(菜品名字和价格自行决定)。

  2. 显然不同的菜品介绍是不一样的,也就是说调用该菜品类的profile方法时,应该输出符合的介绍,请做到这一点。

Task2.接口和多态

有了菜品,我们还要有管理出餐的系统,也可以理解为这个虚拟快餐店的厨师,当顾客点餐时,如果有其他原因,比如付款超时,或者原料不够,可能取消订单。如果没有异常,厨师就会进行烹饪,然后结束订单。

分析以上过程我们发现,厨师要做的事情就是对订单里的每个菜品检查(check)和烹饪(cook)。

  1. 请你了解接口相关的知识,创建一个名为Order的接口,里面有cook和check两个方法,cook输出该菜品的烹饪方法,check随机返回true(表示原料足够可以烹饪该菜品)或者false(表示不能烹饪该菜品),模拟实际情况中可能某些菜品原料不够的情况。让你的菜品类继承这个接口,并完成厨师类System的manageOrder函数。

  2. 我们都知道面向对象的三大特性:封装继承多态,其实接口就是多态的一种实现机制,厨师调用的明明是Order类的方法,实际执行的却是Dish_1或者Dish_2的方法

System类如下:

public class System {
	//请补全处理订单的函数
    public void manageOrder(List<Order> dishes){
        //要求1:一旦订单里有一个菜品的原料不足以烹饪,就输出“取消订单”,否则输出所有菜品的烹饪方法,最后再输出该订单的编号,编号从1开始递增。
    }
}
public class System {
	//请补全处理订单的函数
    public void manageOrder(List<Order> dishes){
        //要求1:一旦订单里有一个菜品的原料不足以烹饪,就输出“取消订单”,否则输出所有菜品的烹饪方法,最后再输出该订单的编号,编号从1开始递增。
    }
}

接口真是个好东西!厨师只需要关注自己要做的事情,也就是Order接口里的方法,而新的菜品只要实现了Order接口,就可以让厨师管理和烹饪了。

Task3.泛型

菜品和厨师都准备好了,顾客可以来点单了!所以我们要对刚才写好的manageOrder函数进一步完善,传入的参数除了订单,还有顾客。顾客点单可能是从餐桌上的二维码扫码进入,也可能直接从微信的小程序进入,我们用TableCustomer和WechatCustomer表示这两种类型的顾客,对于Wechat类型的顾客,如果是堂食,则不需要额外做什么,如果是外卖,则需要送到顾客的地址。而对于Table类型的顾客,我们要把餐送到对应的餐桌上,当然这些只需要用文字输出来表示即可。

以下是TableCustomer和WechatCustomer类

public class TableCustomer {
    public int tableId;//餐桌编号
}
public class TableCustomer {
    public int tableId;//餐桌编号
}
public class WechatCustomer {
    public String address;//顾客地址
    public boolean takeout;//true代表该顾客是外卖,false代表该顾客是堂食
}
public class WechatCustomer {
    public String address;//顾客地址
    public boolean takeout;//true代表该顾客是外卖,false代表该顾客是堂食
}
  1. 了解泛型相关的知识,按照要求进一步完善manageOrder函数。

出题人QQ:2575824162

本题提交方式

提交点这里

主题示例:2024090101012-张三-JAVA-06