里氏替换原则_OOP七大设计原则的Python实现--里氏替换原则

OOP七大设计原则的Python实现

里氏替换原则

什么是里氏替换原则?

如果对每一个类型为S的对象O1,都有类型为T的对象O2,***使得以T定义的所有程序P*** 在所有的对象O1都替换成O2时,程序P的行为没有发生变化,那么类型S是类型T的子类型(If for each object O1 of type S there is an object o2 of type T such that for all programs P defined in terms of T,the behavior of P is unchanged when O1 is substituted for O2 then S is a subtype of T)。

所有引用基类的地方必须能透明地使用其子类的对象(Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it)。

1 概述

继承是OOP的三大特点与优势之一,通过使用继承可以使相关类间的层次结构关系更加清晰,能有效的提高代码的重用性和扩展性。但是如果滥用继承反而会适得其反,不仅增加了父子类之间的耦合性,还会降低子类代码的灵活性。因为父类的属性和方法对子类具有侵入性的,同时如果修改了父类的属性或方法,将会影响其所有子类功能的运行。在以面向对象方式编程时,继承的运用是必不可少的,因为它是非常优秀的语言机制,优点如下:

  • 代码共享,减少创建类的工作量,每个子类都自动继承了父类的方法和属性。
  • 有效提高代码的重用性与扩展性。
  • 子类形似父类,但是又可以异于父类,因为子类不但拥有父类的功能,还可以额外添加属于自己的功能。

但事物都是具有两面性的,继承除了有上述的优点外,也有如下几个方面的缺点:

  • 继承是具有侵入性的, 也就是只要子类使用了继承,就必须拥有父类的所有方法和属性,这就降低了代码的灵活性,让子类有了一些约束。
  • 代码的耦合性增加,当父类中的常量、变量、方法被修改时,就需要考虑子类的修改,这种修改可能会带来代码大量重构的糟糕结果。

在编码过程中引入里氏替换原则,就可以在使用继承的过程中扬长避短。

2 示例代码

在类T中定义方法foo、bar,在类S中定义方法talk。

9355146861f0b0b53b851406a03e90cb.png
af1b5ba8c8044e56041df269b84377b9.png

里氏替换原则通俗来讲就是——子类可以扩展父类的功能,但是不能改变父类原有的功能。里氏替换原则为我们良好的使用继承提供了一个规范,其核心内涵是任何使用基类的地方都可以在不了解其子类具体实现的情况下,无条件地使用其子类替换,而不会产生任何错误或异常。

那么如何编码出符合里氏替换原则的代码呢?

3 子类必须完全实现父类的抽象方法,但是不可覆盖父类的非抽象方法

代码示例:

抽象类ABUserInfo提供了抽象方法getName与非抽象方法getTitle,其中getName方法需要被子类UserInfo重写。

79cf26b055adbdfa4251aa3e9614947c.png

若需求发生了变化,还需要展示用户个人资料的相关信息,我们采用如下方式编码了一个新的子类UserInfo,它不仅实现了父类的抽象方法,还重写了父类的非抽象方法。

dc15e81d58a3487389e75a6902548221.png

虽然代码运行正常,但由于抽象类ABUserInfo是为展示用户信息而开发的,其子类需遵从父类的约定,应该均是用户信息类。但是在使用类ShowUserInfo展示用户信息时,却发现展示的不是用户信息而是个人资料,所以在子类中重写抽象父类中的非抽象方法是不符合里氏替换原则规范的。

4 ⼦类可以实现自身特有的⽅法

父类一般是由众多实体对象提取共性而抽象出来的,子类是对父类共性的个性实现,父类的共性是子类的规范同时也是一种约束,这种约束在一定程度上限制了子类的功能。在一些特殊应用场景中,子类需要打破常规、摆脱束缚、颠覆传统、彰显个性。解决方式是在父类共性范围之外增加子类特有的方法。

代码示例:

抽象类ABCar为自动驾驶汽车和传统汽车提供了行驶的方法。类AutoCar作为抽象类ABCar的子类,在重写了父类中的抽象方法run之外,还额外增加了auto_run方法以实现自动驾驶。

b096efc6279c019810101c513dc75c3e.png

作者简介

1d98edea9fc8fba6a24b89ff5ed66b74.png

211工程院校贵州大学管理学院硕士研究生、互联网金融行业资深DevOps研发工程师. 曾在国内多家知名互联网公司 平安科技、微众银行、顺丰科技、魅族任职. 具有多年国内一线互联网公司自动化运维平台设计与开发经验。

更多优质原创文章请关注微信公众号【稻壳编程】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值