好的,我们假设我有一个名为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()返回的东西而不用类似的方式编辑类?
谢谢.
这样做的方法是基于面向对象的编程
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)
在这个小例子上很难显示出构图的好处.但是演示了编码到接口的方法.