如何从java

时间:2016-11-30 05:52:08

标签: java oop inheritance

我有两个类 Apple Orange ,如下所示:

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

}

我的问题:在 FruitManeger 类中实现getJuice方法的最佳方法是什么?

如你所知,如果我有很多成果,我应该添加很多 if else 到期。

当然,我可以使用反射来按名称调用方法,但是当getJuice方法返回一个对象并且你想要做同样的事情时,这不是一个好主意。

有没有更好的方法?

3 个答案:

答案 0 :(得分:12)

  

有更好的方法吗?

是的,将该应用程序重写为更加明确的方式......

请记住:你不能修改Apple或Orange,但是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();
     }
}

答案 1 :(得分:1)

您可以使用switch而不是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);
        }
    }

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