好的我有一个抽象类'Order':
public abstract class Order {
protected String location;
protected double price;
public Order(double price, String location){
this.price = price;
this.location = location;
}
public abstract double calculateBill();
public String getLocation() {
return location;
}
public double getPrice() {
return price;
}
public abstract String printOrder(String format);
}
我还有3个实现它的课程类似,当然除了他们根据税收,关税等计算不同。
现在我正在尝试创建和OrderManager类来管理它们。这就是我到目前为止所拥有的
public class OrderManager {
private ArrayList<Order> orders;
public OrderManager() {
}
public OrderManager(ArrayList<Order> orders) {
this.orders = orders;
}
public void addOrder(Order o) {
orders.add(o);
}
public ArrayList<Order> getOrdersAbove(double val) {
for (Order o : orders) {
double bill = o.calculateBill();
if (bill > val)
orders.add(o);
}
return orders;
}
我遇到了getOrdersAbove方法的问题,该方法应该返回并且其账单高于val的订单的数组列表。作为calculateBill是抽象的并且在每个子类中实现,我应该只能调用它吗?如果是这种情况,那么OrderManager不应该扩展Order吗?或者只是在同一个包中允许我调用它的方法?或者我是不是错了?
感谢您的帮助!
答案 0 :(得分:0)
作为calculateBill是抽象的并且在每个子类中实现 我应该只能称它为正确的顺序?
该方法声明为public
,您可以在Order
个实例上调用它。
如果是这种情况,那么OrderManager不应该扩展订单吗?
问问自己:OrderManager是一个订单吗?没有?所以不要让它扩展Order
。
或者只是在同一个包中允许我调用它的方法?
同样,该方法是公开的,所以只要你有一个实例来调用它,你就可以从任何地方调用它。
所以在你的for
循环中
public ArrayList<Order> getOrdersAbove(double val) {
for (Order o : orders) {
double bill = o.calculateBill();
// do logic
}
}
调用calculateBill()
时,Java将使用late-binding(多态)来解析要使用的方法的实际实现。
答案 1 :(得分:0)
您的OrderManager
无需了解calculateBill
的子类的Order
方法。
只要该方法被覆盖,您可以确定如果它是公共的(或者它们在同一个包中),则允许您调用它,因为您无法降低继承方法的可见性。
即使Order
为abstract
且calculateBill
为abstract
,该类也不会禁止您调用该方法。应用于abstract
类的唯一限制是,一旦有了实例(即使其运行时类型较窄),就无法实例化它们,那么您就不必担心任何事情。
答案 2 :(得分:0)
作为calculateBill是抽象的并且在每个子类中实现我应该只能调用它吗?
Java Runtime并不关心calculateBill()
中Order
方法的执行情况,Order
&#34;知道&#34 ; (或者更好的是,&#34;已声明&#34;)一个名为calculateBill()
的方法,它不接受任何参数并返回一个double - 它因为你的行所做的那样:
public abstract double calculateBill();
确保具体的子类实际实现抽象方法是在编译时完成的检查。只要您覆盖了子类中的calculateBill()
方法(编译代码需要这样做),您就可以调用它(从任何地方开始调用)它为public
)。具体实施calculateBill()
- 即它是class Foo
的实施还是class Bar
- 将在运行时为您选择,基于您正在调用它的特定子类实例。
如果是这种情况,那么OrderManager是否应该延长订单?
没有。我不知道为什么会这样。它似乎没有多大意义。如果你这样做了,你必须在calculateBill()
内部OrderManager
具体实施,这似乎没有多大意义。
或者只是在同一个套餐中可以让我称之为“
公共(非静态)方法(calculateBill()
是)可由拥有该类实例的任何人调用,无论调用类是否在同一个包中。
还是我错了?
您似乎在子类中使用抽象方法和实现,以及在抽象类中提供各种方法的默认实现(例如getPrice(), getLocation()
)
答案 3 :(得分:0)
getOrdersAbove应创建一个新的ArrayList来保存高于val的订单。
您正在将所选订单添加回您正在迭代的列表,这将导致迭代器失败。