面向对象设计原则之里氏代换原则

免责声明:内容由作者分享,本文编写由 AmyLi 代为执笔。

里氏代换原则(Liskov Substitution Principle,LSP)是指在一个软件系统中,子类应该可以替换任何基类能够出现的地方,并且经过替换以后,代码还能正常工作。子类也能够在基类的基础上增加新的行为。

里氏代换

定义

  • 严格的定义:如果对每一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都替换成o2时,程序P的行为没有变化,那么类型T2是类型T1的子类型。
  • 通俗的定义:所有引用基类的地方必须能透明地使用其子类的对象。
  • 更通俗的定义:子类可以扩展父类的功能,但不能改变父类原有的功能。

遵循示例1

code
code
code

遵循示例2

code
code
code

不遵循的隐患

使用子类替换父类时,会出现意料之外的结果。

正方形vs长方形

小学数学告诉我们——正方形是特殊的长方形,那么将这个关系转为程序设计,就是说正方形是长方形的子类。如下:

code
code

这样的设计这个是否遵循里氏代换原则勒?

code

当输入的是长方形的时候,自然是没有问题的,代码会在有限次内终止。

里氏代换原则,所有引用基类的地方都能透明的引用子类。我们把传入的参数换成Square对象。很明显程序会一直执行下去,直到int溢出。

怎么遵循——代码设计规则

1.子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
2.子类中可以增加自己特有的方法。
3.当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
4.当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。

重载——反例

code
code
code

重载——正例

code
code

参考

https://blog.csdn.net/xingjiarong/article/details/50081857
https://blog.csdn.net/hfreeman2008/article/details/52344343