0

我正在尝试解决这个问题,但我真的不明白语法。考虑以下代码:

class Parent {
   private String productCode1;      // Format X9999
   private String productCode2;

    public Parent(String productCode1, String productCode2)
    {
        this.productCode1= productCode1;
        this.productCode2= productCode2;

    } 

}

然后我有一个包含我要调用的方法的子类

public Child extends Parent{
    private String[] serialNumbers;

    public Child(String productCode1, String productCode2, String... args){
        super(productCode1,  productCode2,);
        int i = 0;

        for(String serialN: args){
            serialNumbers = new String[10]; 
            serialNumbers[i]= serialN;
            i++;
        }

        public String[] getSerialNumbers(){     //This is the method i want to call
            return this.serialNumbers;
        }
}

这是库存类

public class Inventory{

public ArrayList<Parent> products;

public Inventory(){

    products = new ArrayList<Parent>();  //Some hard coded items
    products.add(new Parent("A0001", "abcdefg"));
    products.add(new Parent("B0010", "abcdefg"));
    products.add(new Parent("C0100", "abcdefg"));
    products.add(new Child("D1000",  "abcdefg", "firstSN", "secondSN", "thirdSN"));
}

public static ProductLine getProduct(ArrayList<Parent> products, String productCode){

    for(int i = 0; i < products.size(); i++){
         ProductLine product = products.get(i);
         if(product.getProductCode().equals(productCode)){
             return product;  
         }
    }

    return null;

}

现在在主类中,我需要检查对象是父对象还是子对象,因为我正在尝试获取序列号,如果我得到序列号,则表示是子对象,否则是父对象.

我试图使用子类中的 getserialNumbers() 的唯一问题

public Application{
    String inputProductCode = keyboard.nextLine(); //Input product code from user
    Inventory inventory = new Inventory();

    ProductLine pFound = inventory.getProduct(inventory.products, inputProductCode);  //check if is Child item

    String[] serNumb = pFound.getSerialNumbers(); //Here is where i get Error cannot find symbol/method getSerialNumbers
    if(serNumb[0] == null){
          // code continue... 
}

我试着像这样投:

String[] serNumb = ((ItemisedProductLine)pFound).getSerialNumbers();

它可以编译,但他(如预期的那样)在运行时向我抛出“无法将父级转换为子级”。

我希望我能很好地解释很长的问题......

4

5 回答 5

2

正确的。你不能做演员,因为Parent根本不是Child.

你可以instanceof用来检查你有什么类型的对象,然后只在你有一个实例的情况下进行强制转换和调用,Child但你通常希望避免做这样的事情。这不是好的面向对象。

您可以做的一件事是将getSerialNumbers()方法放入Parent并始终返回一个空数组,然后将其覆盖Child以实际返回Child的序列号。

当然,在这里重新考虑整个类层次结构也可能是值得的。Parent所有继承自的类都有序列号是否有意义?如果是这样,您应该考虑将所有序列号处理移至Parent. Parentthan的子类会更多Child吗?如果没有,也许Child应该被淘汰。

于 2012-05-13T03:25:34.427 回答
1

这是OOP编程模型中的简单问题:

  • 任何Child实例也是Parent实例。
  • 任何Parent实例也可以是Child实例。

如果您Inventory按以下方式更改类构造函数,则您的程序可以正常工作:

public Inventory()
{
    products = new ArrayList<Parent>();  //Some hard coded items
    products.add(new Child("A0001", "abcdefg"));
    products.add(new Child("B0010", "abcdefg"));
    products.add(new Child("C0100", "abcdefg"));
    products.add(new Child("D1000",  "abcdefg", "firstSN", "secondSN", "thirdSN"));
}

或者更好的方法是instanceof在将Parent实例转换为Child.

于 2012-05-13T05:36:16.480 回答
0

为什么 Parent 类没有 getSerialNumbers 方法?我认为您有 2 个选择:在 Parent 类中实现或在您的逻辑中不考虑父母(使用 instanceof 进行测试)。

于 2012-05-13T03:25:19.667 回答
0

您不能调用子类的方法,除非它是父类中定义的抽象方法。因为 JVM 不理解子类中的方法。Inventory为此,您可以在课堂上做以下事情。

public class Inventory{

public ArrayList<Parent> products;

public Inventory(){

    products = new ArrayList<Parent>();  //Some hard coded items
    products.add(new Child("A0001", "abcdefg"));
    products.add(new Child("B0010", "abcdefg"));
    products.add(new Child("C0100", "abcdefg"));
    products.add(new Child("D1000",  "abcdefg", "firstSN", "secondSN", "thirdSN"));
}

public static ProductLine getProduct(ArrayList<Parent> products, String productCode){

    for(int i = 0; i < products.size(); i++){
         ProductLine product = products.get(i);
         if(product.getProductCode().equals(productCode)){
             return product;  
         }
    }

    return null;

}
于 2012-05-13T03:26:39.173 回答
0

如果您的目标是确定您的对象是 Parent 还是 Child 类型,您可以使用 instanceof 关键字来完成:

if(pFound instanceof Child) {
     //...
}

如果要使用序列号区分类型,Parent 类也必须实现 getSerialNumber 方法。

于 2012-05-13T03:37:40.807 回答