|
试题3、根据题目描述,使用调试工具进行跟踪调试。 本题分值:45分 考核时间:90分钟 考核方式:实操 考核内容:以下Java代码实现一个超市简单销售系统中的部分功能,顾客选择图书等物件 (Item)加入购物车(ShoppingCart),到收银台(Cashier)对每个购物车中的物品统计其价格进行结账。改正代码错误,运行程序。 - package ModifyB;
- // 修正:补全接口方法的返回值类型,规范方法定义
- interface Item {
- void accept(Visitor visitor);
- double getPrice(); // 修正:补充返回值类型double
- }
- // 修正:implement -> implements;补全visit方法的传参
- class Milk implements Item {
- private double price;
- public Milk(double price) {
- this.price = price;
- }
- // 修正:accept方法中传入当前Milk对象给visitor的visit方法
- @Override
- public void accept(Visitor visitor) {
- visitor.visit(this); // 把当前牛奶对象传给访问者
- }
- @Override
- public double getPrice() {
- return price;
- }
- }
- // 修正:删除接口方法修饰符,参数补充类型和名称
- interface Visitor {
- void visit(Milk milk); // 修正:去掉private,补充参数类型Milk
- }
- // 修正:implement -> implements;修正折扣逻辑(原逻辑写反)
- class Cashier implements Visitor {
- private double totalForCart;
- // 修正:折扣逻辑(原代码"<8"打原价,">=8"打9折,逻辑正确但注释描述反了)
- @Override
- public void visit(Milk milk) {
- // 修正注释:牛奶价格≥8元打9折,否则原价
- if (milk.getPrice() >= 8.0) {
- totalForCart += milk.getPrice() * 0.9;
- } else {
- totalForCart += milk.getPrice();
- }
- }
- public double getTotal() {
- return totalForCart;
- }
- }
- class ShoppingCart {
- // 修正:补充ArrayList类的包名
- private java.util.ArrayList<Item> items = new java.util.ArrayList<>();
- public double calculatePrice() {
- Cashier visitor = new Cashier();
- // 修正:遍历商品时,调用accept并传入Cashier对象
- for (Item item : items) {
- item.accept(visitor); // 修正:传入visitor参数
- }
- // 修正:调用visitor的getTotal()方法获取总价
- double total = visitor.getTotal();
- return total;
- }
- public void add(Item e) {
- items.add(e);
- }
- }
- public class Modify2 {
- public static void main(String[] args) {
- // 测试:牛奶价格8.5元,应打9折,折后7.65元
- Milk milk = new Milk(8.5);
- ShoppingCart shop = new ShoppingCart();
- shop.add(milk);
- // 输出购物车计算的总价
- System.out.println("购物车总价:" + shop.calculatePrice());
- // 测试单独调用Cashier的visit方法
- Cashier cash = new Cashier();
- cash.visit(milk);
- System.out.println("单独计算牛奶价格:" + cash.getTotal());
- }
- }
复制代码
|