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);
  }
 }

那么我将如何对 Fruit 列表进行排序并根据它们是什么类型的对象来显示这些对象的特定属性。IE。如果 type=Grape 则显示种子计数。

4

4 回答 4

3
  1. 如果要对 Fruit 进行排序,则需要为 Fruit 类实现 Comparable 接口。

  2. 如果要显示属性,请在 Fruit 类中有一个抽象方法并在子类中提供实现。这种方式取决于 Fruit 的实例,它将显示相应的属性。

    公共抽象类 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

您可以向 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 尾巴。为简单起见,有两种方法可以做到这一点,要么只有 Dog 有方法“wagTail()”(因为 Cats 不摇尾巴),或者 HousePets 有一个名为“wagTail()”的方法,由 Cats 和 Dogs 继承(但猫的版本什么都不做)。如果我们选择第一个示例,代码将如下所示:

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

对于第二个示例,它看起来像这样:

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

The second example takes a little less code and is a little more streamlined. In the worst case scenario, if we go with the first option, we will need an if-block for each new subtype of HousePet, which will make the code bulkier/uglier/etc. Better yet we could have a HousePet method called "showHappiness", and the Dog would wag its tail while the cat purred.

于 2013-02-20T22:08:20.853 回答
0

I think you need an instanceof operator. It allows you to check object type.

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