0
private List<Fruit> myFruit = new Vector<Fruit>();

では、さまざまな種類の果物オブジェクトのリストがある場合、リストを調べてさまざまなオブジェクトを比較するにはどうすればよいでしょうか。

public class Fruit{
 String type;
 String color;

 }

 public class Grape extends Fruit{
  int seedCount;

   public Grape(Attributes attributes){
    this.type = attributes.getValue("type");
    this.color=attributes.getValue("color");
    this.seedCount=attributes.getValue("seedCount");

 }

 public class Banana extends Fruit{
    String color;

   public Banana(Attributes attributes){
    this.type = attributes.getValue("type");
    this.color=attributes.getValue("color");


 }


public load(localName name, Attributes attributes){
if (name.equalsIgnoreCase("grape"){
 Grape grape = new Grape(attributes);
 myFruit.add(grape);
  }
if (name.equalsIgnoreCase("banana"){
   Banana banana = new Banana(attributes);
   myFruit.add(banana);
  }
 }

では、フルーツのリストを並べ替えて、オブジェクトの種類に基づいてこれらのオブジェクトの特定のプロパティを表示するにはどうすればよいでしょうか。すなわち。type=Grape の場合、seedCount を表示します。

4

4 に答える 4

3
  1. Fruit を並べ替えるには、Fruit クラスの Comparable インターフェイスを実装する必要があります。

  2. 属性を表示したい場合は、Fruit クラスに抽象メソッドを持ち、サブクラスに実装を提供します。このように、 Fruit のインスタンスに応じて、対応するプロパティが表示されます。

    public 抽象クラス Fruit は Comparable を実装します{

        public abstract void displayProperties();
    
        @Override
        public int compareTo(Fruit otherFruit){
            return 0;
        }
    
    }
    
    
    public class Banana extends Fruit {
        private int seedCount;
        @Override
        public void displayProperties() {
            // TODO Auto-generated method stub
            System.out.println(seedCount);
        }
    
    }
    
    public class Grape extends Fruit{
        private String color;
        @Override
        public void displayProperties() {
            // TODO Auto-generated method stub
            System.out.println(color);
        }
    
    }
    
于 2013-02-20T22:06:58.140 に答える
0

instanceofオペレーターが必要だと思います。オブジェクトの種類を確認できます。

if (list.get(0) instanceof Grape) {
    // list.get(0) is Grape
}
于 2013-02-20T22:08:33.477 に答える
0

Fruit に抽象メソッドを追加できますdisplayProperties()

次に、すべての種類のフルーツのメソッドを実装することを余儀なくされ、for ループで呼び出すだけです。displayProperties()

于 2013-02-20T22:06:57.173 に答える
0

これは推奨されませんが、使用できます

if(object instanceof Class) {
    Class temp = (Class) object
    //operate on object
}

しかし、あなたがすべきことは、すべての果物に関連する重要な情報へのアクセスを提供する Fruit インターフェースを作成することです。一般に、余分な情報を取得するためにキャストするべきではありません。

ダウンキャストは悪いことではありませんが、ポリモーフィズムを十分に活用していない可能性があります。ポリモーフィズムを利用するには、サブタイプが共有するスーパータイプに、必要なだけ多くの情報または動作を取得するメソッドがあることを確認する必要があります。

たとえば、HousePets のリストがあり、HousePets はサブタイプの Dog と Cat で構成されているとします。このリストをループして、しっぽを振ることができる HousePets のすべてのしっぽを振る必要があります。簡単にするために、これを行うには 2 つの方法があります。犬だけがメソッド 'wagTail()' を持っているか (猫は尻尾を振らないため)、または HousePets が猫と犬に継承される 'wagTail()' と呼ばれるメソッドを持っています。 (しかし、猫のバージョンは何もしません)。最初の例を選択すると、コードは次のようになります。

 for(HousePet pet : petList)
     if(pet instanceof Dog) {
         ((Dog)pet).wagTail();
     }

2 番目の例では、次のようになります。

 for(HousePet pet : petList)
     pet.wagTail();

2 番目の例では、コードが少し少なくなり、より合理化されています。最悪の場合、最初のオプションを使用すると、HousePet の新しいサブタイプごとに if ブロックが必要になり、コードがかさばったり醜くなったりします。さらによいのは、"showHappiness" という HousePet メソッドを使用して、猫がのどを鳴らしている間に犬がしっぽを振ることです。

于 2013-02-20T22:08:20.853 に答える