难以从超类和子类对象的Array调用子类的方法

时间:2013-09-14 15:53:09

标签: java arrays inheritance instanceof

目的是能够从包含有关stocklevels的信息的文本文件中读取数据到对象中,然后以各种方式操作该对象 文本文件中的字段由“#”分隔。文本文件在一行上有3个字段,在一行上有5个字段。 3个字段的行进入我的超类的构造函数 带有5个字段的行将读入子类

超类称为StockItem,子类称为StockItemFood,它扩展了StockItem(超类)。

下面是我的代码,在一个单独的'Manager'类中找到,它从textfile读取到一个StockItem对象数组。很简单。

public void readFromText() throws IOException, FileNotFoundException{
    String [] temp;
    BufferedReader br = new BufferedReader (new FileReader("stocklist.txt"));
    String line = br.readLine();

    while(line!=null){
        temp=line.split("#");

        if (temp.length==3){
            s[counter]=new StockItem(temp[0], (double) Integer.parseInt(temp[1]), temp[3]);
        }else if (temp.length==5){
            s[counter]=new StockItemFood(temp[0], (double) Integer.parseInt(temp[1]), temp[2], (double) Integer.parseInt(temp[3]), (double) Integer.parseInt(temp[4]));
        }
    }

    counter++;
    br.close();
}

在下面的方法中,我试图返回一个String,它将从超类中返回一个方法并从子类中的方法返回。但是当我输入s [y]时,我无法看到我的子类方法。如下所示。

public String getOrderingList(){ 
    String toOrder="";

    for(int y = 0; y < s.length; y++){
        toOrder+=s[y].getDescription() + s[y].//getOrderAmount() <-subclass method          
        }
    }

    return toOrderl
}

以下是我的子类的代码:

public class StockItemFood extends StockItem {

private double min,max; //3.2

public StockItemFood(String description, double quantity, String units,double min, double max) { //3.3
    super(description, quantity, units);
    this.min = min;
    this.max=max;
}

public boolean mustOrder(){ //3.4
    boolean b;

    if(getQuantity()<min){
        b=true;
    } else {
        b=false;
    }
    return b;
}

public double getOrderAmount(){ //3.5
    double amount = max-getQuantity();
    return amount;
}

}

我想过可能使用了instanceof,但我并不完全确定所需的语法,而且我还阅读了几篇帖子,建议避免使用instanceof。

非常感谢任何帮助。 - 肖恩

2 个答案:

答案 0 :(得分:0)

abstract class StockItem{

     protected abstract double getOrderAmount();


     public String getOrderingList(){
          String result = method(); //can invoke it
     }
}

class StockItemFood extends StockItem{
   @Override
   protected double getOrderAmount(){
      //return the value
   }
}

Abstract keyword in Java

我不知道我是否完全理解你的问题。但我会尽力回答。在基类中创建方法getOrderAmount()abstract

如果您设计中的每个StockItem都有订单金额,那么您应该在类StockItem中将其定义为抽象方法。

  

我还阅读了一些建议避免的帖子   的instanceof。

是的,您应该避免使用instanceof,因为这意味着您的代码没有正确的设计。

答案 1 :(得分:0)

仍然不清楚你的解释,给出的解决方案是基于一种微弱的理解,通过编辑你的问题进一步解释,然后可能会提供更好的解决方案。

假设s是SuperClass类型的数组

String toOrder = "";
for(int y=0;y<s.length;y++){
  toOrder+=s[y].superClassMethod();

  if(s[y] instanceof subclass) {
    toOrder+= ( (SubClassName)s[y]).subClassMethod();
  }
}

将为您效劳