里氏替换原则

里氏替换原则(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。
相关推荐
We་ct3 分钟前
深度剖析浏览器跨域问题
开发语言·前端·浏览器·跨域·cors·同源·浏览器跨域
身如柳絮随风扬10 分钟前
多数据源切换实战:从业务场景到3种实现方案全解析
java·分布式·微服务
skywalk816312 分钟前
在考虑双轨制,即在中文语法的基础上,加上数学公式的支持,这样像很多计算将更加简单方便,就像现在的小学数学课本里面一样,比如:定x=2*x + 1
开发语言
小书房15 分钟前
Kotlin的by
android·开发语言·kotlin·委托·by
就叫飞六吧31 分钟前
QT写一个桌面程序exe并动态打包基本流程(c++)
开发语言·c++
threelab40 分钟前
Three.js 代码云效果 | 三维可视化 / AI 提示词
开发语言·javascript·人工智能
Java小生不才41 分钟前
Spring AI文生音
java·人工智能·spring
凯尔萨厮44 分钟前
Springboot2.x+Thymeleaf项目创建
java
V搜xhliang02461 小时前
OpenClaw科研全场景用法:从文献到实验室的完整自动化方案
运维·开发语言·人工智能·python·算法·microsoft·自动化
kaikaile19951 小时前
风、浪、流环境模型的船舶三自由度(纵荡、横荡、艏摇)运动仿真MATLAB
开发语言·人工智能·matlab