我有两个类 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方法返回一个对象并且你想要做同样的事情时,这不是一个好主意。
有没有更好的方法?
答案 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);
}
}