编辑类中的返回值而不修改类本身?

时间:2014-02-26 20:42:57

标签: java

好的,我们假设我有一个名为Pancake的课程。

Pancake.java看起来像这样:

public class Pancake {
    public boolean shouldEat() {
        return false;
    }
}

现在,我根本不想编辑Pancake.java。我想做的就是改变shouldEat()从不同的类返回的内容,例如“NotPancake.java”。

我知道我是否有像

这样的东西
public boolean eat = false;

我可以通过执行类似Pancake.eat = true之类的操作来轻松改变它,但有没有办法更改shouldEat()返回的内容,而无需以类似的方式编辑类?

感谢。

2 个答案:

答案 0 :(得分:7)

这样做的方法基于Object Oriented programming

public class NotPancake extends Pancake {

 @Override
 public boolean shouldEat() {
        return true;
    }
}

这里发生的魔法称为“继承”,是分配给OO的四个元素之一。

这里发生的是您定义从Pancake提供的新结构。

这意味着NotPancake继承了Pancake形式。所以NotPancake是一个煎饼。

 Pancake p = new Pancake();
 Pancake q = new NoPancake(); 

 print(p.shouldEat()); //Will be false
 print(q.shouldEat()); //Will be true

这种关系使我们有可能改变行为,我们可以从超类中重新定义所有public,protected和defaults方法。

在我们的子类中,我们定义了一个具有相同签名的方法,我们说这个方法覆盖了前一个方法。在Java中,您应该添加注释@Override以便另外通知编译器。

这是一种方法。继承很简单,但在编写复杂程序时会产生很多问题,另一种解决方案称为composition。你应该总是喜欢组合而不是继承。

构图基于抽象性。要使用它,需要interface。接口是对实现它的类的合同的描述。

public interface Dish {

   boolean isEatable();

}

界面名称应代表一些抽象的一般概念。

 public class Pancake implements Dish {
  @Override
  public boolean shouldEat() {
     return false;
  }
}

public class Carrot implements Dish {

 @Override
 public boolean shouldEat() {
     return true;
  }
}

用法更不一样。

 Dish dish1 = new Pancake();
 Dish dish2 = new NoPancake(); 

 print(dish1.shouldEat()); //Will be false
 print(dish2.shouldEat()); //Will be true

在这个小例子上很难说明构图的好处。但是展示了coding to interface方法。

答案 1 :(得分:3)

Pancake p = new Pancake() {
   public boolean shouldEat() {
      return true;
   }
 };