仅将子类实例添加到我的集合类中

时间:2016-11-11 20:24:52

标签: java class inheritance arraylist collections

我正在编写一个包含不同类的程序,并且有一个集合类,它只存储超类的子类。 好的,所以我有一个存储数量的Order超类。代码段如下:

abstract class Order { //superclass
 private int quantity; //instance variables

 public Items(int quantity) { //constructor
  this.quantity = quantity;
 }

 public int getQuantity() { // instance method
  return quantity;
 }

 public abstract double totalPrice();

然后我有order类的子类。子类如下。

class Coffee extends Order { //subclass 
 private String size; //instance variables

 public Coffee (int quantity, String size) { //constructor
  super(quantity);
  this.size = size;
 } //... some other methods
} // end of Coffee class

class Donuts extends Order { //sub-class
 private double price; //instance variables
 private String flavour;

 public Donuts(int quantity, double price, String flavour) { //constructor
  super(quantity);
  this.price = price;
  this.flavour = flavour;
 } //...some other methods
} //end of donut class

class Pop extends Order {
 private String size;
 private String brand;

 public Pop(int quantity, String size, String brand) {
  super(quantity);
  this.size = size;
  this.brand = brand;
 } //...again there are some other methods
} //end of pop sub-class

现在这是我需要帮助的地方。我编写了一个包含ArrayList<>的集合类。代码片段是这样的:

class OrderList {
 private ArrayList<Order> list;

 public OrderList() {
  list = new ArrayList<Order>();
}

我想在集合类中做的是让实例方法确保只将子类添加到我的集合类中。*

到目前为止我所尝试的是这个(这让我变得完全傻瓜,我知道)。

public void add(Coffee cof) {
 list.add(cof);
}
public void add(Donut don) { // i know we cant have methods with the same name
 list.add(don);
}

public void add(Sandwich sand) {
 list.add(sand);
}

public void add(Pop p) {
 list.add(p);
}

SO社区你能不能给我一些关于我的问题的提示。

3 个答案:

答案 0 :(得分:2)

您的抽象错误。产品..不是订单。

产品只是一种产品。它有一些“身份”,可能还有不同的“味道”。但是当你考虑它时,最初,它不是一个订单。当客户选择各种产品,将它们放入购物卡中时,订单就会出现......并点击“订单”按钮。

想想事情是如何“在真实的”世界。这就是指导您构建的模型的原因。

含义:您的产品不应该是Order的子类。相反,你可能会做类似的事情:

public abstract class ShopItem {
  // that contains those things that all products in the shop have in common, like
  public abstract double getPrice();

...

然后所有产品都扩展到该类。完全避免继承可能更有用,并将ShopItem转换为接口(这取决于你是否真的找到使用抽象类的充分理由;为了定义 common < / strong> ShopItems的行为。)

下一步:

public class ProductOrder {
  private final ShopItem orderedItem ...
  private final int quantity ...

将事情融合在一起:

public final class Order {
  private final List<ProductOrder> allItemsOfAnOrder ...

答案 1 :(得分:0)

您的方法签名将是:

public void add(Order order){
...
}

因为订单可以保留对其任何子类型的引用。

答案 2 :(得分:0)

我真的不需要你自己OrderList。由于Order是一个抽象类,因此您只能将非抽象子类的实例添加到您声明的任何List<Order>

此外,而不是

class OrderList {
    private ArrayList<Order> list;

    public OrderList() {
        list = new ArrayList<Order>();
    }
}

您也可以使用

class OrderList extends ArrayList<Order> {

    public OrderList() {
        super();
    }
}

然后只使用从父类继承的add(Order element)

但话说回来,只要您不想添加任何新方法(不是这样),只要在ArrayList<Order>的任何地方声明OrderList即可。由常规List给出以证明有额外的课程。