博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式原则之里氏替换原则
阅读量:5972 次
发布时间:2019-06-19

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

转载自:

定义: 

 

    1:如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。

 

    2:所有引用基类的地方必须能透明地使用其子类的对象

通俗来讲:父类必须能够使用子类替换

 

里氏替换原则能带来哪些好处?

  1. 里氏替换原则能够将对于基类中定义的所有子程序,用在它的任何一个派生类中时的含义都应该是相同的。这样继承才不会增加复杂度,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。继承带来的复杂度就降低了。

  2. 针对基类编程可以提高代码的复用性

 

 

如何保证遵循里氏替换原则

    继承是保证里氏替换原则的前提,但是继承也有不能满足里氏替换原则的时候。此时我们可以采用如下两种方法进行设计:

 

1、重新提取公共部分的方法

     把冲突的派生类与基类的共部分提取出来作为一个抽象基类,然后分别继承这个类。

 

2、改变继承关系

     即:从父子关系变为委派关系或兄弟关系。

     可以把它们的一些公有特性提取到一个抽象接口,再分别实现。

 

例如:

    最初发送邮件的设计如下:

 

  考虑到给普通人发送邮件和给VIP用户发送邮件中的send方法中的代码有重复,遵从里氏替换原则,我们将共有部分的代码提取出来,并改变CommonCustomer和VIPCustomer的继承关系。修改之后如下:

 

 

总结:

里氏替换原则通俗的来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能。

  1. 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。

  2. 子类中可以增加自己特有的方法。

  3. 当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。

  4. 当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。

 

 

 

 

你可能感兴趣的文章
Mysql数据库误删除数据恢复成功
查看>>
自己收藏的前端网站
查看>>
使用mybatis自动生成指定规则的编号
查看>>
SQLSERVER排查CPU占用高的情况
查看>>
Swift中如何重新懒加载
查看>>
Vysor:安卓手机放到电脑上用
查看>>
AutoCompleteTextView的简单用法
查看>>
scala学习笔记(一)入门初探
查看>>
ios开发学习--列表(Table)效果源码分享--系列教程4
查看>>
布局管理器 2----- 表格布局
查看>>
开源 java CMS - FreeCMS2.8 自定义标签 channelSon
查看>>
nginx实现防止ddos攻击
查看>>
Fibonacii数列,兔子问题
查看>>
2016,成为更好的自己
查看>>
mysql双向复制(主主模式)
查看>>
我的友情链接
查看>>
【二叉树系列】二叉树课程大作业
查看>>
买台式电脑还是笔记本好?
查看>>
数1 游戏
查看>>
UILable文字不居中问题
查看>>