好的,假设我有一个名为 Pancake 的类。
Pancake.java 看起来像这样:
public class Pancake {
public boolean shouldEat() {
return false;
}
}
现在,我根本不想编辑 Pancake.java。我想要做的就是更改
shouldEat()
从不同的类返回的内容,例如“NotPancake.java”。我知道如果我有类似的东西
public boolean eat = false;
我可以通过执行类似
Pancake.eat = true
之类的操作轻松更改它,但是有没有办法更改 shouldEat()
返回的内容而无需以类似方式编辑类?谢谢。
最佳答案
这样做的方法是基于 Object Oriented programming
public class NotPancake extends Pancake {
@Override
public boolean shouldEat() {
return true;
}
}
这里发生的魔法称为“继承”,是分配给 OO 的四个元素之一。
这里发生的是你定义了从 Pancake 交付的新结构。
这意味着
NotPancake
继承了 Pancake
形式。所以 NotPancake 就是 Pancake。 Pancake p = new Pancake();
Pancake q = new NoPancake();
print(p.shouldEat()); //Will be false
print(q.shouldEat()); //Will be true
这种关系使我们有可能改变行为,我们可以重新定义父类(super class)中的所有公共(public)、保护和默认方法。
当在我们的子类中定义一个具有相同签名的方法时,我们说这个方法覆盖了前一个方法。在 Java 中,您应该添加注释
@Override
以额外通知编译器有关它的信息。这是一种方法。继承很简单,但在编码复杂程序时会产生很多问题,另一种解决方案称为 composition 。并且您应该始终更喜欢组合而不是继承。
构图是基于抽象性的。要使用它,需要
interface
。接口(interface)是对实现它的类所遵循的契约的描述。public interface Dish {
boolean isEatable();
}
接口(interface)的名称应该代表一些抽象的一般概念。
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 方法。
关于java - 在不修改类本身的情况下编辑类中的返回值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22052797/