我正在编写一个具有不同类的程序,并且有一个集合类,它将仅存储超类的子类。好的,我有一个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>
可能会更方便。