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

我正在编写一个包含不同类的程序,并且有一个集合类,它只存储超类的子类.

好的,所以我有一个存储数量的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();

然后我有订单类的子类.子类如下.

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社区可以请你给我一些关于我的问题的提示.

最佳答案 你的抽象错了.产品..不是订单.

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

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

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

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 ...
点赞