前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【设计模式】软件设计七大原则 ( 里氏替换原则 | 定义 | 定义扩展 | 引申 | 意义 | 优点 )

【设计模式】软件设计七大原则 ( 里氏替换原则 | 定义 | 定义扩展 | 引申 | 意义 | 优点 )

作者头像
韩曙亮
发布2023-03-29 15:43:16
8530
发布2023-03-29 15:43:16
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

一、里氏替换原则定义


里氏替换原则定义 :

如果 对每一个 类型为 T1 的 对象 o1 , 都有 类型为 T2 的 对象 o2 ,

使得 以 T1 定义的 所有程序 P 在 所有对象 o1 都 替换成 o2 时 ,

程序 P 的 行为 没有发生变化 ,

那么 类型 T2 是 类型 T1 的 子类型 ;

符号缩写说明 : T 是 类型 Type , o 是 对象 Object , P 是 程序 Program ;

通俗理解 :

T1 类 生成 o1 对象 ,

T2 类 生成 o2 对象 ,

开发的 程序 P 中 使用了 T1 类型 , 使用 T1 创建了对象 o1 ,

将程序中 所有的 o1 都替换成 T2 o2 时 ,

程序 P 的行为 , 没有发生变化 ,

可以认为 T2 是 T1 的子类型 ;

T2 是 T1 的子类型 , T1 则是 T2 的父类 ;

里氏替换原则 是 继承复用 的基石 , 只有当 子类 可以 替换 父类 , 并且 软件功能不受影响 时 , 父类才能真正的被复用 , 子类也能在父类的基础上 增加新的行为 ;

里氏替换原则 是对 开闭原则 的补充 , 实现开闭原则的关键是 进行抽象 , 父类 和 子类 的继承关系 , 就是 抽象 的具体实现 ;

二、里氏替换原则定义扩展


里氏替换原则定义扩展 :

一个 软件实体 如果 适用于 一个父类的话 ,

那 一定适用于其子类 ,

所有 引用父类的地方 , 必须能 透明地 使用其子类的对象 ,

子类对象 能够 替换父类对象 , 而 程序逻辑不变 ;

通过继承深入理解里氏替换原则 :

抽象类父类中如果已经有实现好的方法 , 实际上 , 是在设定一系列的规范 和 契约 ,

父类不强制要求子类遵从这些契约 ,

但是如果子类任意修改父类的非抽象方法 ,

就会破坏整个继承体系 ,

里氏替换原则 明确反对 子类重写父类方法 ;

继承作为 面向对象 的特性之一 , 给设计程序时 , 带来了很大的便利 , 同时也 带来很多弊端 ;

如 : 使用继承 , 会给程序带来一些侵入性 , 降低可移植性 , 增加了对象间的耦合 ;

如果一个父类 被 很多子类继承 , 假设修改该父类 , 必须考虑所有的子类 , 否则会给系统引入未知风险 ;

三、里氏替换原则引申意义


子类 可以 扩展 父类的功能 , 但是绝对不能 改变 父类原有的功能 ;

子类 可以 实现 父类的 抽象方法 , 但是 不能 覆盖 父类的 非抽象方法 ;

子类中 可以 增加 自己特有的方法 ;

重载 ( 输入参数 宽松 ) : 子类的方法 重载 父类的方法 时 , 方法的前置条件 ( 输入参数 ) , 要比 父类方法的输入参数更宽松 ;

如 : 父类的参数是 HashMap , 如果要符合 里氏替换原则 , 子类如果重载父类方法 , 那么需要使用 Map 类型参数 ; ( 这里注意区分 重写 与 重载 , 重写是重写父类方法 , 重载是函数名相同 , 参数不同 )

重写 ( 返回值 严格 ) : 当 子类的方法 重写 / 重载 / 实现 父类的方法时 , 方法的 后置条件 ( 返回值 ) 要 比父类更严格或相等 ;

如 : 父类的返回值是 Map , 子类的相同的方法 是 Map 或 HashMap ;

四、里氏替换原则意义


里氏替换原则 要求很多 , 但是在程序中 , 如果不遵守 里氏替换原则 , 尤其是关于 重载 ( 输入参数 宽松 ) 和 重写 ( 返回值 严格 ) , 都没有特别注意 , 程序也可以正常运行 , 不会出现问题 ; 后果是在 需求变更 , 引入新功能 , 重构时 , 出问题的风险增加 ; 里氏替换原则只是一个约束 , 不是严格执行的标准 ;

五、里氏替换原则优点


里氏替换原则优点 :

  • 防止继承泛滥 : 是 开闭原则 的一种体现 ;
  • 增强健壮性 : 如果满足 里氏替换原则 , 会 加强程序的健壮性 , 同时 变更时 , 可以做到非常好的 兼容性 , 提高程序的 维护性 , 扩展性 ; 降低需求变更时 引入的风险 ;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-08-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、里氏替换原则定义
  • 二、里氏替换原则定义扩展
  • 三、里氏替换原则引申意义
  • 四、里氏替换原则意义
  • 五、里氏替换原则优点
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档