博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【设计模式攻略】OO设计原则之LSP-Liskov替换原则
阅读量:3523 次
发布时间:2019-05-20

本文共 1199 字,大约阅读时间需要 3 分钟。

概要
什么是所谓的替换原则?开发中我们通常会通过继承实现一些子类来达到功能的扩展,比如假设我们有基类B,有个B类型的指针或引用作为某个函数的参数,这时我们创建了子类C继承于B,如果当把指向C类对象的指针作为参数传递时,出现了一些意料之外的异常时,它就违反了LSP。说的有点抽象,
到实例再具体说明。
目的
子类类型完全能替换基类类型而不会发生异常
实例与效果
举个LSP经典的例子来说明下吧。
比如我们有个Rectangle,可以设定长和宽,同时可以计算它的面积,我们还有正方形的需求,所以我们创建一个Square类,继承于Rectangle。具体实现如下:
class Rectangle {public:     virtual void SetWidth(int w) {          mWidth = w;     }     virtual void SetHeigth(int h) {          mHeigth = h;     }     virtual int GetArea() {          return mWidth * mHeigth;     }protected:     int mWidth;     int mHeigth;};class Square extends Rectangle {public:     virtual void SetWidth(int w) {          mWidth = w;          mHeigth = h;     }     virtual void SetHeigth(int h) {          mHeigth = h;          mWidth = w;     }};
是不是觉得做得挺好,貌似没有什么问题?好,略微分析一下吧。比如我们一般会通过工厂类来获得Rectangle*类型的对象,而在一些条件下用户可能并不知道或者并不关心当前指针是指向什么类型的对象(Rectangle?Square?),这时候问题就来了。假设工厂类方法声明为:
Rectangle* RecFactory::GetInstance();//(static)
调用的代码如下:
Rectangle* rec = RecFactory.GetInstance();rec->SetWidth(10);rec->SetHeigth(20);int area = rec->GetArea();
getInstance返回的是指向Square 的对象时,调用方可能觉得结果应该是200,而实际结果却是400。原因很明显,正方形Square的行为特性跟Rectangle不同,导致SetWidth,SetHeigth的行为跟基类的行为特性不一致,最终出现异常的结果。LSP就是这么一回事。

转载地址:http://xdeqj.baihongyu.com/

你可能感兴趣的文章
Java标准库定义的常用异常,自定义异常 2020-2-15
查看>>
Java问题百度/Google记录 2020-2-16
查看>>
【PADS9.5】9,对比ECO核心板,Router移动元件后布线消失,Router找不到自动布线策略文件丢失或损坏
查看>>
【STM32+w5500汇总】23,HTTP_Client 连接到ONENET上传了一段数据之后会断开,数据上传格式的设置
查看>>
【STM32+W5500+MQTT】24,所有功能都可以通过API函数的调用来实现;HTTP接入ONENET,API开发手册和打包函数,串口软件HTTP连接服务器上传数据,2018年12月28日
查看>>
【STM32+W5500+HTTPClient】25,路由器DHCP租赁IP时间为2h,NetBios可以很好的解决IP变化的问题,DNS,2018年12月25日
查看>>
【STM32+MQTT+ONENET】26,MQTT协议接入OneNET
查看>>
【STM32+W5500+MQTT+ONENET】27,MQTT协议接入OneNET实际编程操作 2018年12月27日
查看>>
【STM32Cube+FreeRTOS 】28,KEIL5的F12不起作用;***JLink Error: Can not read register x while CPU is running
查看>>
【STM32CubeMX+FreeRTOS 】29,prtinf卡死;4任务只运行了3个;W5500联网失败(堆栈不能太大或者太小)
查看>>
【STM32+FreeRTOS +W5500移植要点】30,RTOS中断;从TIM2,主TIM3;RTOS主要用在LCD中;RT-Thread;标志重定义问题 2019年01月22日
查看>>
【STM32+FPGA+FSMC】31,FSMC熟练掌握;KEIL5生成bin文件;SDRAM的使用;IAP检验码 2019年04月10日
查看>>
【IC1】【转 非常好】运算放大器使用的六个经验
查看>>
【IC-ADC 3】ADC的选型
查看>>
2019年03月18日 查看数据手册的注意点,极限参数、电气参数、推荐参数
查看>>
HiKey960/970用户手册;HiKey960 Development Board User Manual
查看>>
【IC8】作为一名硬件工程师,需要哪些知识?
查看>>
【书籍推荐】FPGA,xilinx
查看>>
N9-SQL注入(union注入)
查看>>
N10-sql注入(information_schema注入)
查看>>