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

sn0*_*man 3 java

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

Pancake.java看起来像这样:

public class Pancake {
    public boolean shouldEat() {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我知道我是否有类似的东西

public boolean eat = false;
Run Code Online (Sandbox Code Playgroud)

我可以通过做类似的事情来轻松改变它Pancake.eat = true,但有没有办法改变shouldEat()返回的东西而不用类似的方式编辑类?

谢谢.

Dam*_*ash 7

这样做的方法是基于面向对象的编程

public class NotPancake extends Pancake {

 @Override
 public boolean shouldEat() {
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

这里发生的魔法称为"继承",是分配给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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

public interface Dish {

   boolean isEatable();

}
Run Code Online (Sandbox Code Playgroud)

接口的名称应该代表一些抽象的一般概念.

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

public class Carrot implements Dish {

 @Override
 public boolean shouldEat() {
     return true;
  }
}
Run Code Online (Sandbox Code Playgroud)

用法更不一样.

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

 print(dish1.shouldEat()); //Will be false
 print(dish2.shouldEat()); //Will be true
Run Code Online (Sandbox Code Playgroud)

在这个小例子上很难显示出构图的好处.但是演示了编码到接口的方法.