只向集合类添加子类实例



我正在编写一个具有不同类的程序,并且有一个集合类,它将仅存储超类的子类。好的,我有一个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社区你能给我一些提示我的问题。

您的抽象是错误的。产品…不是命令。

产品就是产品。它有一些"身份",可能也有不同的"味道"。但是当你想到它的时候,最初,它不是一个命令。当客户选择各种产品,将它们放入购物卡时,订单就存在了……然后点击"订购"按钮。

想想"现实"世界里的事情是怎样的。这应该指导你建立的模型。

意思:你的产品不应该子类化订单。相反,您可以这样做:

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

,然后所有的产品都扩展了这个类。在这里完全避免继承可能更有用,并将ShopItem转换为接口(这取决于您是否真的找到使用抽象类的好理由;(为了定义ShopItems的通用行为)。

下:

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

和把事情放在一起:

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

你的方法签名将是:

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

,因为Order可以保存对其任何子类型的引用。

我真的不认为需要自己的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)

但话又说回来,只要您不添加任何新方法(不是由常规List提供的)来证明有一个额外的类,只要在您打算使用OrderList的地方声明ArrayList<Order>可能会更方便。

相关内容

  • 没有找到相关文章