2016-07-27 4 views
1

から親クラスの変数にしかアクセスできないので、私が実行している問題はこれです。私は、ArrayList内のすべてのオブジェクトを表示するために使用しているプログラムの一部としてメソッドを記述しました。このArrayListには、菌類、花、雑草の3種類のオブジェクトが格納されています。 plantList.get(i).getName()plantList.get(i).getColorメソッドに問題なく電話することができます。これらの変数は両方とも、Plantという親クラスに属しています。しかし、次のメソッドplantList.get(i).getPoison()(このメソッドはサブクラスFungusに属しています)を呼び出すと、変数Fungusを見つけることができないというコンパイラエラーが発生します。メソッド

私はサブクラスに固有の他のすべての変数と同じことを試みました。だから、私は親クラス '植物'から変数をアクセスできますが、 '真菌'の '花'や '雑草'のサブクラスからはアクセスできません。私はサブクラスやスーパークラスを初めて使うので、どこに問題が発生しているのかを正確に把握するのに苦労しています。

public static void displayPlant(ArrayList<Plant> plantList) { 
    for (int i = 0; i < plantList.size(); i++) { 
     System.out.print(plantList.get(i).getName()); 
     System.out.print(plantList.get(i).getID()); 
     System.out.print(plantList.get(i).getColor()); 
     if (plantList.get(i).contains(Fungus) == true) { 
      System.out.print(plantList.get(i).getPoison()); 
     } 
     else if (plantList.get(i).contains(Flower) == true) { 
      System.out.print(plantList.get(i).getSmell()); 
      System.out.print(plantList.get(i).getThorns()); 
     } 
     else { 
      System.out.print(plantList.get(i).getPoison()); 
      System.out.print(plantList.get(i).getEdible()); 
      System.out.print(plantList.get(i).getMedicinal()); 
     } 
    } 
} 
+0

これは予想される動作です。子クラス固有のメソッドにアクセスするには、それぞれの子クラスの型にキャストを入力する必要があります。 – JavaHopper

答えて

0

Javaはstrongly typed言語です。つまり、子クラスのメソッドを使用する場合は、子クラスにcast downを割り当てる必要があります。あなたの例では

... 
else if (plantList.get(i) instanceof Fungus) { //check if plant is fungus 
    System.out.print(plantList.get(i).getSmell()); 
    System.out.print(((Fungus)plantList.get(i)).getThorns()); //downcasting 
} 
... 

constainsを使用してあなたのチェックが動作しません。オブジェクトのタイプを確認するには、演算子instanceofを使用する必要があります。

+1

ありがとう!これは、子クラスのコマンドを実行していた私の問題の反対側を解決します。大いに感謝します –

+0

あなたが好きなanwserをupvoteし、正しいアンカーとして1つをマークしてください。 –

2

ダイナミックディスパッチを使用することをお勧めします。私。要素自身が印刷したい情報を決定させる。

class Plant { 
    ... 
    public String toString() { 
     return String.join(" ", getName(), getID(), getColor()); 
    } 
} 

class Fungus extends Plant { 
    ... 
    @Override 
    public String toString() { 
     return String.join(" ", super.toString(), getPoison()); 
    } 
} 

class Flower extends Plant { 
    ... 
    @Override 
    public String toString() { 
     return String.join(" ", super.toString(), getSmell(), getThorns()); 
    } 
} 

class Weed extends Plant { 
    ... 
    @Override 
    public String toString() { 
     return String.join(" ", super.toString(), getPoison(), getEdible(), getMedicinal()); 
    } 
} 

あなたのループは次のようになります。

実際
public static void displayPlant(ArrayList<Plant> plantList) { 
    for(Plant p : plantList) 
     System.out.println(p); // This calls toString 
} 
+0

PS。 'toString'では' String1.join'を使って 'value1 value2 value3'のような文字列を作成しました。もちろん、どんなフォーマットでも 'String'を返すことができます。 –

+0

助けてくれてありがとう!私はこの解決策を見てそれを消化するのにもう少し時間をかけなければならないだろうが、私がやっていたやり方よりもはるかに簡潔に思える。 –

1

あなたは間違った方法でそれをやっている、

あなたは、コンパイル時に、親クラス変数に子クラスのオブジェクトを保持したら、親クラスで宣言されているメソッドと変数のみを検索または検索します。

あなたは子クラス変数にアクセスしたい場合、あなたは最初の子クラスを見つけると、私はそれはあなたを助け願ってい

public static void displayPlant(ArrayList<Plant> plantList) { 
    for (int i = 0; i < plantList.size(); i++) { 
     Plant plant=plantList.get(i); 
     if (plant instanceof Flowers) { 
      Flowers fl=(Flowers)plant; 
      //TODO do whatever you want to do 
     } 
     else if(plant instanceof Weeds) { 
      Weeds wd=(Weeds)plant; 
      //TODO do whatever you want to do 
     }else if (plant instanceof Fungus) { 
      Fungus wd=(Fungus)plant; 
      //TODO do whatever you want to do 
     } 
    } 

を合わせて型キャストする必要があります。ありがとう

+1

ありがとうございます!私はこれが構造の点で私が探しているものだと思います。私は今夜​​/明日にこれを実装し、それがどのように機能するかを報告します。 –

関連する問題