比较扩展对象

时间:2013-02-20 22:02:53

标签: java oop

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显示seedCount。

4 个答案:

答案 0 :(得分: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);
        }
    
    }
    

答案 1 :(得分:0)

您可以向Fruit displayProperties()

添加抽象方法

然后你将被迫为所有类型的水果捏造方法,然后在你的for循环中你只需要调用displayProperties()

答案 2 :(得分:0)

不建议这样做,但您可以使用

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

但你应该做的是创建一个水果界面,可以访问与所有水果相关的重要信息,一般情况下你不应该抛弃它来获取额外的信息。

虽然向下倾斜不是邪恶的,但它可能意味着你没有充分利用多态性。要利用多态性,应确保子类型共享的超类型具有获取所需信息或行为的方法。

例如,假设您有一个HousePets列表,HousePets由子类型Dog和Cat组成。你循环遍历这个列表,并希望摇摆可以摇尾巴的HousePets的所有尾巴。为简单起见,有两种方法可以做到这一点,或者只有Dog有方法'wagTail()'(因为Cats不会摇尾巴),或者HousePets有一个叫做'wagTail()'的方法,它由Cats and Dogs继承(但猫的版本什么都不做)。如果我们选择第一个示例,代码将如下所示:

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

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

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

第二个示例需要的代码少一些,并且更加简化。在最糟糕的情况下,如果我们选择第一个选项,我们将需要一个if-block用于HousePet的每个新子类型,这将使​​代码更笨重/更丑陋/等。更好的是,我们可以使用名为“showHappiness”的HousePet方法,并且当猫咕噜咕噜时,狗会摇尾巴。

答案 3 :(得分:0)

我认为你需要一个instanceof运营商。它允许您检查对象类型。

if (list.get(0) instanceof Grape) {
    // list.get(0) is Grape
}