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

设计原则 | 里式替换原则

一、里式替换原则(Liskov Substitution Principle )

1、原理

子类型必须能替换掉它们的基类型,在使用继承时,遵循里式替换原则,在子类中尽量不要重写父类中的方法。里式替换原则告诉我们,继承实际上让两个类耦合性增强了,在适当的情况下,可以通过依赖、组合、聚合等来解决问题

2、面向对象的继承性的思考

继承包含这样的一层含义:父类中凡是已经实现好的方法,实际上是在设定规范和契约,虽然它不强制要求所有的子类必须遵循这些契约,但是如果子类对这些已经实现的方法任意修改,就对整个继承体系造成破坏。

继承再给程序设计带来便利的同时,也带来了弊端。比如:使用继承会给程序带来侵入性,程序的可移植性降低,增加对象间的耦合,如果一个类被其他的类所继承,则当这个类需要修改时,必须考虑到所有的子类,并且父类修改后,所有涉及到子类的功能都有可能产生故障。

3、示例

3.1、版本一

定义一个A类与B类,B类继承A类,在B类中重写了A类中的func1方法,在方法调用时会遇到困惑,如下:

#include <iostream>
using namespace std;class A
{
public:int func1(int num1, int num2){return num1 - num2;}
};class B : public A
{
public:// 派生类重写父类的方法int func1(int num1, int num2){return num1 + num2;}
};int main()
{A objA;B objB;cout << objA.func1(11, 3) << endl;  // 输出结果:8cout << objB.func1(11, 3) << endl;  // 输出结果:14return 0;
}

上述代码存在的问题

  • 调用B对象的func1方法时,预期结果与调用A对象的func1方法一致,实际上由于B类重写了func1方法,导致输出结果不符合预期

3.2、版本二

为了解决重写父类方法带来的问题,通常的做法是让原先的父类与子类都继承自一个更通用的基类,原有的继承关系去掉,使用依赖、组合、聚合等替代,改进后的代码如下:

#include <iostream>
using namespace std;class Base
{// 把通用的方法写到基类
};class A : public Base
{
public:int func1(int num1, int num2){return num1 - num2;}
};class B : public Base
{
public:B(){m_pA = new A;}int func1(int num1, int num2){return num1 + num2;}// B类中调用A类提供的方法int func2(int a, int b){return m_pA->func1(a, b);}private:// 通过成员变量建立与A类的关联关系A *m_pA;
};int main()
{A objA;B objB;cout << objA.func1(11, 3) << endl;cout << objB.func2(11, 3) << endl;return 0;
}
http://www.lryc.cn/news/256355.html

相关文章:

  • 第7节:Vue3 动态绑定多个属性
  • 【文件上传系列】No.1 大文件分片、进度图展示(原生前端 + Node 后端 Koa)
  • 性能测试 —— Jmeter分布式测试的注意事项和常见问题
  • “SRP模型+”多技术融合在生态环境脆弱性评价模型构建、时空格局演变分析与RSEI 指数的生态质量评价及拓展应用
  • 总结|哪些平台有大模型知识库的Web API服务
  • TOMCAT9安装
  • QT中时间时区处理总结
  • OpenAtom OpenHarmony三方库创建发布及安全隐私检测
  • 【1】一文读懂PyQt简介和环境搭建
  • windows install git
  • 【华为数据之道学习笔记】3-7 报告数据治理
  • SpringDataRedis 操作 Redis,并指定数据序列化器
  • useradd 在Linux原生应用开发过程中的简单应用
  • Linux 删除文件名乱码的文件
  • 【测试人生】数据同步和迁移的变更注意事项
  • 快手视频如何去掉水印?三个简单好用视频去水印方法
  • 【Linux】stat命令使用
  • 【JavaEE】多线程(3) -- 线程等待 wait 和 notify
  • 自行编写一个简单的shell!
  • mvn site 命令
  • <JavaEE> 经典设计模式之 -- 定时器
  • 【C++ Primer Plus学习记录】if语句
  • 结构体,自定义类型
  • Ubuntu22.04通过Maas和Juju部署openstack charm
  • 老有所依:TSINGSEE青犀养老院智能视频监管方案
  • vue中的this.$nextTick().then()
  • Python处理Excel文件并与数据库匹配做拼接
  • 【出现模块node_modules里面包找不到】
  • 高项备考葵花宝典-项目进度管理输入、输出、工具和技术(中,很详细考试必过)
  • sql注入 [GXYCTF2019]BabySQli1