2013-05-20 250 views
0

我偶然發現了這種情況,但我不知道如何處理它的正確方法:訪問屬性

class Coffee { } 
class CoffeeMix extends Coffee { 
    public boolean shaken; 
} 

我節省在數組列表中的咖啡項目:

ArrayList<Coffee> coffees = new ArrayList<Coffee>(); 

所以在這個數組列表中存在普通的咖啡對象和咖啡混合對象。現在我要顯示所有咖啡組合對象,都動搖:

for(Coffee c : coffees) { 
    //here is the same problem as above 
} 

正如我在計算器上一些答案閱讀:的instanceof似乎是一個壞主意,因爲背後有OO了它螺絲的想法。那麼如何處理呢?

+0

是如何從這種不同[您剛纔的問題?(http://stackoverflow.com/q/16658109/139010) –

+0

我沒有看到一個問題,在這種特殊情況下使用的instanceof。 –

+0

上一個問題裏擠滿了很多普通的等等,我認爲直接提出一個新問題是一個更好的主意。 – freakout

回答

-2

instanceof似乎是恰當的位置,但如果你真的不想使用它,你可以嘗試一些醜:

for (Coffee c : coffees) { 
    try { 
     CoffeeMix blend = (CoffeeMix) c; 
     //whatever you want to do with CoffeeMix objects 
    } catch (ClassCastException cce) { 
     //whatever you want to do with Coffee objects 
    } 
} 

這似乎是在治癒比疾病本身更糟糕的情況,但只要CoffeeMix對象具有某些對象不可用的字段或屬性,應拋出異常,並且您將完成分類分類,而不會以很高的成本使用instanceof正確的技術

+3

正常執行流程使用異常..不不不! – JamesB

+0

嘿,我說這是個壞主意,是不是?嘖。 – cabbagery

0

首先,當我們談論OO時,我們不應該使用公有領域。我明白你爲什麼要避免使用實例。 在這種情況下,您可以使用多態和動態綁定。您可以將抽象isShaken方法添加到基類中,使其在CoffeeMix中作爲私有進行動作並覆蓋isShaken(返回動搖)

0

您應該確實使用多態。這是去這裏的最佳方式。但是你希望你也可以使用getclass en檢查它是否等於指向的類。

+0

Instanceof運算符與比較兩個對象的類的語義不同。見http://stackoverflow.com/a/596507/467874 – prasopes

+0

我沒有說他們是一樣的,但在上述情況下,它似乎給了他期望的解決方案和高效率。你不同意嗎? – docDevil

0

您可以使用訪客模式。

下面是一個例子如何可以應用到你的情況:

interface CoffeeElement { 
    void accept(CoffeeVisitor visitor); 
} 

interface CoffeeVisitor { 
    void visit(Coffee coffee); 
    void visit(CoffeeMix coffee); 
} 


class Coffee implements CoffeeElement { 

    private final String name; 

    public Coffee(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    @Override 
    public void accept(CoffeeVisitor visitor) { 
     visitor.visit(this); 
    } 

    @Override 
    public String toString() { 
     return "Coffee [name=" + getName() + "]"; 
    } 
} 

class CoffeeMix extends Coffee { 

    public CoffeeMix(String name) { 
     super(name); 
    } 

    @Override 
    public void accept(CoffeeVisitor visitor) { 
     visitor.visit(this); 
    } 

    @Override 
    public String toString() { 
     return "CoffeeMix [name=" + getName() + "]"; 
    } 

} 

class PrintingCoffeeVisitor implements CoffeeVisitor { 

    @Override 
    public void visit(Coffee coffee) { 
     // ignore regular coffee 
    } 

    @Override 
    public void visit(CoffeeMix mix) { 
     System.out.println(mix); 
    } 

} 

class CoffeeTest { 

    public static void main(String[] args) { 
     List<Coffee> coffee = new ArrayList<Coffee>(); 
     coffee.add(new Coffee("Java")); 
     coffee.add(new Coffee("Molokai")); 
     coffee.add(new CoffeeMix("Season Blend")); 

     CoffeeVisitor v = new PrintingCoffeeVisitor(); 
     for (Coffee c : coffee) { 
      c.accept(v); 
     } 
    } 

} 

您還可以閱讀Visitor模式的這種解釋。我發現它非常有用。

https://stackoverflow.com/a/2604798/467874