里氏替换原则(Liskov Substitution Principle,LSP)是面向对象设计 SOLID 原则中的 "L",由 Barbara Liskov 于 1987 年提出。其核心思想是:
定义
子类对象必须能够替换其父类对象,且不会破坏程序的正确性。即:如果程序原本使用父类对象,那么替换为任意子类对象时,程序的行为不应发生异常或逻辑错误。
核心思想
行为一致
子类应保持父类的契约(方法的功能、输入/输出约束),不能改
变父类原有逻辑,不要随意重写父类的方法。
注意:
1.在使用继承时,遵循里氏替换原则,在子类中尽量不要重写父类的方法
2里氏替换原则告诉我们,继承实际上让两个类耦合性增强了,在适当的情况下,可以通
过聚合、组合、依赖来解决问题。
代码举例:
像这样随意更改父类的方法和逻辑,很容易混淆产生错误
java
public class LisKov1 {
public static void main(String[] args) {
A1 a = new A1();
System.out.println(a.function1(11,3));
System.out.println(a.function1(1,8));
System.out.println("------------------");
B1 b = new B1();
//这里本意求11-3的结果
System.out.println(b.function1(11,3));
System.out.println(b.function1(1,8));
System.out.println(b.function2(11,3));
}
}
class A1{
public int function1(int num1,int num2){
return num1-num2;
}
}
class B1 extends A1 {
public int function1(int num1,int num2){
return num1+num2;
}
public int function2(int num1,int num2){
return function1(num1,num2)+9;
}
}
解决:
写一个类使a和b类同时继承,在b中同样可以使用a中的方法,降低耦合度
java
public class LisKov2 {
public static void main(String[] args) {
A a = new A();
System.out.println(a.function1(11,3));
System.out.println(a.function1(1,8));
System.out.println("------------------");
B b = new B();
//这里本意求11-3的结果
System.out.println(b.function3(11,3));
System.out.println(b.function3(1,8));
System.out.println(b.function2(11,3));
}
}
class A extends Base{
public int function1(int num1,int num2){
return num1-num2;
}
}
class B extends Base{
//如果B要使用A类的方法使用一个组合的关系
private A a = new A();
public int function1(int num1,int num2){
return num1+num2;
}
public int function2(int num1,int num2){
return function1(num1,num2)+9;
}
//我们仍然想使用a的方法
public int function3(int num1,int num2){
return a.function1(num1,num2);
}
}
class Base{
public int function1(int num1,int num2){
return 1;
}
}
补充:
- 若子类必须重写父类方法,需确保行为逻辑与父类契约一致(如输入/输出约束、异常类型等),否则可能违反 LSP。