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通常はそのようなことを避けたいと考えています。それは良いOOPではありません。

あなたができることの1つは、getSerialNumbers()メソッドを入れて、Parent常に空の配列を返し、それをオーバーライドして、Child実際にChildのシリアル番号を返すことです。

もちろん、ここでクラス階層全体を再検討することも価値があるかもしれません。から継承するすべてのクラスParentがシリアル番号を持つことは意味がありますか? その場合は、すべてのシリアル番号の処理を まで移動することを検討してくださいParentParentよりも多くのサブクラスが存在することはあり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にキャストする前にキーワードでチェックすることです。ParentChild

于 2012-05-13T05:36:16.480 に答える
0

オブジェクトのタイプが親か子かを判断することが目標の場合は、instanceofキーワードを使用して行うことができます。

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

シリアル番号を使用してタイプを区別する場合は、ParentクラスもgetSerialNumberメソッドを実装する必要があります。

于 2012-05-13T03:37:40.807 に答える
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

親クラスにgetSerialNumbersメソッドがないのはなぜですか? 親クラスに実装するか、ロジックで親を考慮しない(instanceofでテストする)という2つのオプションがあると思います。

于 2012-05-13T03:25:19.667 に答える