当前位置: 首页 > news >正文

LSP里氏替换原则

LSP强调子类必须能够替换父类。即子类应该具有与父类相同的行为和功能,而不仅仅是继承父类的属性和方法。LSP是对继承机制的约束规范、是指导接口与实现的设计原则。

LSP关键点

  • 前置条件不能强化:子类方法的参数类型必须与父类相同或者更为宽松
  • 后置条件不能弱化:子类方法的返回值类型必须与父类相同或者是其子类型
  • 不变量要保持:子类不能破坏父类原有的约束条件。
  • 异常类型需兼容:子类方法抛出的异常必须是父类方法抛出异常的子类型。

示例代码

不符合LSP的代码

class Shape {  void draw() {  System.out.println("Drawing a shape");  }  
}
class Circle extends Shape {void draw() {System.out.println("Drawing a circle");  }
}

使用LSP优化后的代码

interface Drawable {  void draw();  
}  
class Shape implements Drawable {  public void draw() {  System.out.println( "Drawing a shape");  }  
}  
class Circle extends Shape {  public void draw() {  System.out.println("Drawing a circle");  }  
}

注意点

子类与父类具有一致的行为和功能:子类必须具有与父类相同的行为和功能,且不能改变父类的行为和功能。

避免继承滥用:避免通过继承来共享行为,继承是用来实现多态,而不是为了代码的重用。如果子类需要不同的功能和行为,那应该通过重写父类方法来实现。

多态与里氏替换原则

多态是实现里氏替换原则的技术手段

多态借助继承和方法重写,让子类对象能够替代父类对象使用。而里氏替换原则要求子类在替换父类时,不能改变程序原有的正确性。所以,多态为里氏替换原则提供了具体的实现方式。

举个例子,有一个抽象类 Shape定义了 area()方法,Rectangle和Circle作为它的子类分别对该方法进行了实现。在使用时,我们可以编写通用代码来处理Shape对象,这就是多态的体现,同时遵循了里氏替换原则。

多态是里氏替换原则的外在表现形式,它通过动态调用子类方法,实现了程序的灵活性和可扩展性。

里氏替换原则是对多态的约束和规范

多态的实现需要遵循一定规则,不然就可能引发问题。里氏替换原则明确了子类在行为上必须与父类保持兼容。要是违背了里氏替换规则,在运行时就可能出现意外情况。比如,子类重写方法时抛出了父类没有声明的异常,那么调用该方法的代码就可能无法正常处理。

里氏替换原则是多态的内在约束,它确保了子类对象能够无缝替换父类对象,从而为多态的实现提供了可靠的语义基础。

两者侧重点不同

  • 多态:关注代码的实现机制,核心在于 “同一接口,多种实现”,目的是提高代码的灵活性。
  • 里氏替换原则:重点在于设计层面,强调子类和父类之间的行为兼容性,目的是保证系统的稳定性。

共同服务于面向对象设计

里氏替换原则和多态都遵循开闭原则,也就是对扩展开放、对修改关闭。多态通过接口抽象来实现功能扩展,而里氏替换原则确保扩展不会破坏已有的系统。

参考

《架构整洁之道》-- Robert C.Mattin

《架构师的自我修炼》 – 李智慧

《设计模式之美》 – 王争

相关文章:

  • 全息美AISEO引领未来智能营销新趋势
  • 关键点检测--使用YOLOv8对Leeds Sports Pose(LSP)关键点检测
  • Kubernetes生产实战(十六):集群安全加固全攻略
  • 协议路由与路由协议
  • 数据库索引详解:原理 · 类型 · 使用 · 优化
  • 流式数据(Streaming Data)和非流式数据(Batch Data)区别、使用场景、优化-来自前端的浅解
  • Python常见面试题
  • AST(抽象语法树)与 HBO(基于历史的优化)详解
  • 单片机-STM32部分:11、ADC
  • 【C++】 —— 笔试刷题day_27
  • 电影感户外哑光人像自拍摄影Lr调色预设,手机滤镜PS+Lightroom预设下载!
  • AI编程: 使用Trae1小时做成的音视频工具,提取音频并识别文本
  • 扩容 QCOW2 磁盘镜像文件
  • PCB设计实践(十三)PCB设计中差分线间距与线宽设置的深度解析
  • Linux架构篇、第四章_ELK与EFK-7.17.9的日志管理
  • 图像处理篇--- HTTP|RTSP|MJPEG视频流格式
  • 对日开发 TeraTerm ttl脚本开发环境配置
  • 轻松制作高质量视频,实时生成神器LTX-Video重磅登场!
  • PostgreSQL 的 pg_collation_actual_version 函数
  • Redis经典面试题
  • 智利观众也喜欢上海的《好东西》
  • 印度一战机在巴基斯坦旁遮普省被击落,飞行员被俘
  • 韩德洙成为韩国执政党总统大选候选人
  • 市自规局公告收回新校区建设用地,宿迁学院:需变更建设主体
  • 美乌基金协议:美国搞了一套可在资源富集地区复刻的商业模式
  • 化学家、台湾地区“中研院”原学术副院长陈长谦逝世