2016-11-30 21 views
1

調用同樣的方法有兩類蘋果橙色這樣的:我如何從兩個不同的類中的Java

public final class Apple{ 
    int getJuice(); 
} 
public final class Orange{ 
    int getJuice(); 
} 

,我不能改變他們。 我有第三類fruitsManeger這樣的:

class FruitManeger { 
    Apple apple; 
    Orange orange; 

    enum Fruits{ 
     Apple,Orange 
    } 

    Fruits favorFruits;  

    int getJoice(){ 
     if(favorFruits==Fruits.Apple){ 
       apple.getJuice(); 
     }else if(favorFruits==Fruits.Orange){ 
       orange.getJuice(); 
     } 
    } 

} 

我的問題:什麼是落實getJuice方法FruitManeger類最佳途徑?

正如你可以看到,如果我有很多水果,我應該添加很多如果其他到期。

當然,我可以使用反射來按名稱調用方法,但getJuice方法返回一個對象並且您想要執行與此相同的操作時不是一個好主意。

有沒有更好的辦法?

+0

我不能改變蘋果和橙類 – max

+0

我們將不得不問,爲什麼你不能改變蘋果和桔子......因爲你需要的,如果/ case語句的鉅額就是一個直接結果。順便說一下,你可以使用Reflection來處理返回的對象......你只需要更多的if/case語句。 –

+0

,因爲蘋果和橙色是在Java庫 – max

回答

10

有沒有什麼更好的辦法?

是,重構該應用程序爲更多的面向對象的方式...

記住:你不能修改蘋果或橘子,但OOP允許你延長確保這些類,因爲它們不是最終的.. 。

class CorrectApple extends Apple implement IJuiceble{ 
    @Override 
    int getJuice(); 
} 
class CorrectOrange extends Orange implement IJuiceble{ 
    @Override 
    int getJuice(); 
} 

現在

interface IJuiceble{ 
    int getJuice(); 
} 

最後經理:

class FruitManeger { 
    private CorrectApple apple; 
    private CorrectOrange orange; 

    int getJoice(IJuiceble correctfruit){ 
     return correctfruit.getJuice(); 
    } 
} 
+0

對不起,但他們是。看到我編輯的問題 – max

+0

一個移動的目標 –

+0

@最好如果你不提供正確的/完整的信息,那麼這個答案甚至不會編譯......我的設計現在是無用的.... –

-1

通過參照該Answer

interface IScalable { 
    void setScale(int scale); 
    int getScale(); 
} 

class DataSizeAction extends EncoderAction implements IScalable { 
    ... 
} 

class SomeoneElse { 
    private int scale = 2; 

    public void setScale(IScalable scalable) { 
     scalable.setScale(this.scale); 
    } 
} 
+1

這個問題表明,無論出於何種原因,Apple和Orange類都不能改變,並且它們沒有實施或擴展任何東西。 –

1

您可以使用開關而不是if/else。

class FruitManager { 
    Apple apple; 
    Orange orange; 

    enum Fruits { 
     Apple, Orange 
    } 

    Fruits favorFruits; 

    int getJoice() { 
     switch (favorFruits) { 
     case Apple: 
      apple.getJuice(); 
      break; 
     case Orange: 
      orange.getJuice(); 
      break; 

     default: 
      System.err.println("Fruit not found. " + favorFruits); 
     } 
    } 
+0

越多的水果,你在經理中更大的開關箱和枚舉.... –

+1

這是一個不好的解決方案,但是這個問題的解決方案。我更喜歡接口解決方案。 – jklee

+1

我喜歡你接近的方式\ –

相關問題