里氏替换原则
案例:
假设 B 类中有一个 jia(int num1, int num2) 的方法,功能是将 num1 + num2 的计算结果算出。这时候 A 类继承了 B 类。使用者 C 类调用了 A 类中的 jia 方法,理论上应当得到的是加法结果。那么问题来了,如果 B 类继承 A 类后将 jia(int num1, int num2) 进行重写。那么 C 类的调用将无法得到正确的结果。
里氏替换原则:
- 在使用继承时,应当遵循里氏替换原则,在子类中尽量不要重写父类的方法
- 继承实际上会增强两个类的耦合性,在适当的情况下可以通过聚合、组合、依赖来解决问题
案例代码
public class B {
public int jia(int num1, int num2) {
return num1 + num2;
}
public void console(int num){
System.out.println(num);
}
}
public class A extends B {
public int jia(int num1, int num2) {
return num1 - num2;
}
}
public class Main {
public static void main(String[] args) {
A a = new A();
// 由于A类没有遵循里氏替换原则,重写了 jia 方法。使计算的结果变成了不正确的结果
System.out.println(a.jia(1, 3)); // 调用者想得到 1+3 的结果,实际结果是 1-3
}
}
console
-2
依里氏替换原则解决案例情况
思路:将不能被修改的代码向上抽取,将 A 和 B 进行解耦
案例思路代码
public class Base {
public void console(int num){
System.out.println(num);
}
}
public class B extends Base{
public int jia(int num1, int num2) {
return num1 + num2;
}
}
public class A extends Base {
// 这里我们臆想为 jia 方法的作者命名不规范将减法方法命名为了加法方法
public int jia(int num1, int num2) {
return num1 - num2;
}
}
public class Main {
public static void main(String[] args) {
A a = new A();
// 由于A类没有遵循里氏替换原则,重写了 jia 方法。使计算的结果变成了不正确的结果
a.console(a.jia(1, 3)); // 调用者想得到 1-3 的结果,实际结果是 1-3
// 这时候如果我们还想使用加法方法,那么只需要将 B 方法进行实例化即可
B b = new B();
b.console(b.jia(1, 3));
}
}
console
-2
4
网友评论