【问题标题】:Java creating objects within objectsJava 在对象中创建对象
【发布时间】:2013-12-11 17:02:24
【问题描述】:

我正在尝试创建披萨菜单。我有 3 节课,

  • PizzaBase(带有获取/设置底部厚度的方法 [薄的或深的])
  • PizzaTopping,再次使用 get/set 方法 对于浇头的类型
  • Pizza,存储我的成本变量和 使用继承在 3 个类中使用。

作为一个成本变量,用于基料、浇头和整个比萨饼本身。

现在我的问题是,我将如何创建一个 Pizza 对象,然后创建 1 个基础对象和几个浇头对象,每个对象都有价格?

我可以计算出如何计算总体价格,我只是有点卡在对象中创建对象。

 public class PizzaTopping extends Pizza{

private String topping;




public String getTopping(){
    return this.topping; 
}

public void setTopping( String topping ){
    this.topping = topping;

    }

}



   public class PizzaBase extends Pizza{

  private String base;  


    public void setBase( String base ){
    this.base = base;
    }

    public String getBase(){
        return this.base;
    }




 }




 public class Pizza {
private double cost;

public void setCost( double cost ){
    this.cost = Math.abs(cost);
}
public double getCost(){
    return this.cost; 
}


public void makingPizza(){
    PizzaBase b = new PizzaBase();



}

 }

【问题讨论】:

  • 为什么PizzaTopping 应该扩展PizzaPizzaPizzaToppings 的组成PizzaTopping 本身不是 Pizza。我会重新考虑对象模型。
  • 是的,自从提出这个问题以来,我已经摆脱了继承方面。每个类现在都有自己的成本属性。但是我仍在努力在对象中创建对象
  • 你已经在一个对象中有一个对象,String topping。没有比这更特别的了。
  • 我会为您的“定价”创建一个界面。这样,您可以使用多态性并给您的老师留下深刻印象。其次,我没有看到任何构造函数,只有 getter/setter。我将在 Pizza 上有一个构造函数,它采用 PizzaTopings 和 PizzaBase 的数组/列表。然后,此构造函数将在其自身上设置所有适当的项目(封装,老师也喜欢它)。 PizzaToppings 和 PizzaBase 类可能也需要某种构造函数。

标签: java object


【解决方案1】:

将 Pizza 类替换为 CostableItem 类:

public class CostableItem {
 private double cost;

 public void setCost( double cost ){
    this.cost = Math.abs(cost);
 }
 public double getCost(){
    return this.cost; 
 }
}

然后在浇头和底部扩展它:

public class PizzaBase extends CostableItem {...}
public class PizzaTopping extends CostableItem {...}

然后创建一个名为 Pizza 的类,该类具有一个基础和多个浇头:

public class Pizza{
 private PizzaBase base;
 private ArrayList<PizzaToppings> toppings;
 //..
}

【讨论】:

  • 最好把CostableItem做成接口。
  • 我也是这么认为的,只是回答他关于如何在对象内部创建对象的问题。
【解决方案2】:

您根本不需要继承。最多你可能需要一个接口。所以我会这样设计:

public interface PricedItem {
   double getCost(); //double is suitable for our purposes
}

由于您要计算成本,因此所有已定价的项目都应具有getCost() 方法。这将适用于您的 PizzaToppingPizzaBasePizza 类:

public class PizzaTopping implements PricedItem

    private String name;
    private double cost;

    public PizzaTopping(String name, double cost) {
        this.name = name;
        this.cost = cost;
    }

    ...

    @Override
    public double getCost() {
        return cost;
    }
}

PizzaBase 大致相同:

public class PizzaBase implements PricedItem {

    private double cost;

    ...

}

您的Pizza 类也将实现PricedItem。但同样重要的是,您将拥有一组 PizzaTopping 实例;这里没有继承!

public class Pizza implements PricedItem {

   private double cost;
   private PizzaBase base;
   private List<PizzaTopping> toppings;

   public Pizza(double cost, PizzaBase base) {
        this.cost = cost;
        this.base = base;
        toppings = new ArrayList<PizzaTopping>();
   }

   ...

   public void addTopping(PizzaTopping topping) {
       //left as an exercise to the reader :)
   }

   @Override
   public double getCost() {
        //this is left as an exercise to the reader :)

        return totalCost;
   }  
}

【讨论】:

    猜你喜欢
    • 2011-08-08
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 2021-07-30
    • 2010-10-12
    • 2021-07-29
    • 2016-07-21
    • 2021-01-16
    相关资源
    最近更新 更多