java - 对象和继承

标签 java object data-structures

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

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

2) PizzaTopping 类 - 模拟披萨配料

3) Pizza 类 - 携带有关披萨的基本信息,包括单一底料和多种配料

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

这是我到目前为止的一些代码:

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;
    }

}

最佳答案

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)。在该方法中,我将返回一个字符串,而不是打印到标准输出。如果需要的话,将其留给调用者打印。

  • 对方法使用驼峰式命名法(例如 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;
    }
}

我不会像雅顿建议的那样费心预先计算成本。在我看来,这将是不成熟的优化,并且只有在调用者不断调用 cost() 时才能节省周期。

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

关于java - 对象和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20563790/

相关文章:

java - 如何将 Google map 容器添加到 Codename One 上的 GUI 构建器?

java - 如何引用位于单独库 jar 文件中的 OpenGL 着色器文件?

java - 如何使用 SVNKit 添加/提交新文件到 SVN

algorithm - 是否有一种算法可以检测相对于数据集的奇数值

javascript - 最合适的数据结构是什么? (使用带有间隙的数组是否有缺点或注意事项?)

java - 如何防止在随机 int 中生成值? ( java )

javascript - 使用对象文字和默认值创建 javascript 类的最佳方法

algorithm - 在类或对象(在 Scala 中)中编写算法有什么缺点?

我们可以说指针值指定一个对象吗?

algorithm - 算法解决纵横字谜