【问题标题】:Objects & Inheritance对象和继承
【发布时间】:2013-12-13 10:08:18
【问题描述】:

我对编程非常陌生,我的任务是创建一个简单的披萨订购程序。它应该利用对象并利用继承。对于作业的第一部分,我必须创建:

1) PizzaBase 类 - 模拟披萨底(厚或薄)

2) PizzaTopping 类 - 模拟披萨浇头

3) 比萨类 - 携带有关比萨的基本信息,包括单个基料和多个浇头

创建和存储顶部和基础对象的最佳方法是什么?以及如何在该程序中实现继承?稍后,我必须创建一个用户界面来使用顶部对象和基础对象接受订单,并检查比萨饼是否适合素食者。

这是我目前掌握的一些代码:

public class Pizza  {

    private PizzaBase base;
    private ArrayList<PizzaToppings> topList;

    public Pizza(PizzaBase b){
        this.setBase(b);
        this.topList = new ArrayList<PizzaToppings>();
    }

    public void setBase(PizzaBase b){
        base = b;
    }

    public void addTop(PizzaToppings topping){
        topList.add(topping);
    }

    public double pizzaCost(){  
        double cost = base.getcost();
        for(PizzaToppings topping : topList)
        {
            cost += topping.getTopCost();
        }
        return cost;
    }

    public void OrderSummary()
    {

        System.out.println(base.getBase() + ": \t" + base.getcost());
        for(PizzaToppings topping : topList)
        {
            System.out.println(topping.getTopName() + ": " + topping.getTopCost());
        }
        System.out.println();
        System.out.println("total: "+ pizzaCost());
    }

}

public class PizzaBase {

    private String baseName;
    private double cost;

    public PizzaBase(String base, double cost) {
        this.baseName = base;
        this.cost = cost;
    }

    public String getBase() {
        return baseName;
    }

    public double getcost() {
        return cost;
    }

}

【问题讨论】:

  • 我对这个练习(以及那本书中的其他练习)的经验是,实际的工作范围根本不会激发本书提出的设计。这是编程书籍的常见病,这些书籍试图解释在超过 10,000 行代码的代码库中使用(并且有用)的概念,以及 100 行代码的示例。
  • Marko,你知道有什么办法可以解决这个病吗? (我不是在以一种讽刺的方式问这个问题,而是一种真正感兴趣的方式。我同意这是一个问题。)

标签: java object data-structures


【解决方案1】:

Pizza 类可以使用其他方法扩展 PizzaBase 类,例如 addTopping()。名字中有一个暗示——PizzaBase 可以被视为一个基类。

在现实生活中,我不会在这里使用继承。我会有一个 Pizza 类,它由 PizzaBase 和一些配料(即基本上你所做的)构成。

我将 PizzaToppings 重命名为 PizzaTopping,因为它只代表一种浇头。对于素食者检查,您需要了解每种配料是否适合素食者。然后在 Pizza 中,您可以遍历所有浇头,如果任何浇头不合适,则返回 false;如果所有浇头都合适,则返回 true。

更多风格提示:

  • 将 PizzaCost() 重命名为 cost() - 它在 Pizza 类中,因此我们知道它是 Pizza 的成本。 getTopCost() 同上。可以改为 cost()。

  • 将您的字段声明为 List 而不是 ArrayList(您仍然需要构造 ArrayList,但字段类型不需要那么具体)

  • 将 topList 重命名为 toppings

  • 将左大括号放在前一行的末尾,而不是新行。这是最广泛采用的 Java 编码约定。

  • 不要大写方法(例如 OrderSummary 应该是 orderSummary)。在那个方法中,我会返回一个字符串,而不是打印到标准输出。如果需要,请留给调用者打印。

  • 对方法使用 camelCase(例如 getcost 应该是 getCost 甚至更好:cost())。

如果你扩展 PizzaBase...

public class Pizza extends PizzaBase {

    // ...

    public double cost() {
        double cost = super.cost();
        for (PizzaTopping topping: toppings) {
            cost += topping.cost();
        }
        return cost;
    }
}

我不会像 Arden 建议的那样预先计算成本。在我看来,这将是过早的优化,只有在调用者继续调用 cost() 时才能节省周期。

我会小心使用双精度数来表示财务金额。请改用 BigDecimal 以避免舍入错误。另外,这是成本还是价格?需要非常准确的用词。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 2012-01-05
    • 2011-10-08
    • 2014-12-24
    • 2011-12-12
    • 1970-01-01
    相关资源
    最近更新 更多