簡體   English   中英

比較擴展對象

[英]comparing extended objects

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列表進行排序,並根據對象的類型顯示這些對象的特定屬性。 就是 如果type = Grape,則顯示seedCount。

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

您可以向Fruit displayProperties()添加抽象方法

然后,您將不得不對所有類型的水果隱含該方法,然后在for循環中,只需調用displayProperties()

不建議這樣做,但是您可以使用

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

但是您應該做的是創建一個Fruit界面,該界面可以訪問與所有水果相關的重要信息,通常,您不應該為了獲得更多信息而放棄。

雖然垂頭喪氣不是邪惡的,但這可能意味着您沒有充分利用多態性。 要利用多態性,應確保子類型共享的超類型具有獲取所需信息或行為的方法。

例如,假設您有一個HousePets列表,並且HousePets由子類型Dog和Cat組成。 您遍歷此列表,並想要搖晃HousePets可以拖尾的所有尾巴。 為簡單起見,有兩種方法可以執行此操作,或者僅Dog具有方法“ wagTail()”(因為Cats不會搖尾巴),或HousePets具有Cat's and Dogs繼承的名為“ wagTail()”的方法(但Cat的版本不執行任何操作)。 如果選擇第一個示例,則代碼將如下所示:

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

對於第二個示例,它看起來像這樣:

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

第二個示例少了一些代碼,但簡化了一些。 在最壞的情況下,如果我們選擇第一個選項,則將為HousePet的每個新子類型需要一個if塊,這將使代碼更笨重/更丑陋/等。 更好的是,我們可以有一個稱為“ showHappiness”的HousePet方法,當貓發出呼pur聲時,狗會搖尾巴。

我認為您需要一個instanceof運算符。 它允許您檢查對象類型。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM