循环遍历arrayList以获取抽象方法的值

时间:2013-09-18 21:52:45

标签: java loops arraylist abstract

好的我有一个抽象类'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吗?或者只是在同一个包中允许我调用它的方法?或者我是不是错了?

感谢您的帮助!

4 个答案:

答案 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方法。

只要该方法被覆盖,您可以确定如果它是公共的(或者它们在同一个包中),则允许您调用它,因为您无法降低继承方法的可见性。

即使OrderabstractcalculateBillabstract,该类也不会禁止您调用该方法。应用于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的订单。

您正在将所选订单添加回您正在迭代的列表,这将导致迭代器失败。