2016-11-30 42 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

我喜欢你接近的方式\ –

相关问题