原理
子类对象能够替换父类对象,并且保证原来程序的逻辑性不变以及正确性不被破坏
什么叫逻辑性不变?
举个例子,原来父类处理的时候没有任何校验不会抛出error,但是子类新增了一个校验可能会抛出error,那么子类替换父类后程序的逻辑性就会被改变,就违反了LSP原则
多态和里式替换原则的区别
多态:是一种代码实现思路
里式替换原则:是一种设计原则,用来指导子类的设计,子类替换父类的时候不能改变原来程序的逻辑、不能破坏原来程序的正确性
怎么做到里式替换原则
子类的设计要满足父类的行为约定,这些约定包括:函数声明要实现的功能,输入、输出、异常,注释里罗列的特殊说明
函数声明要实现的功能
比如父类有一个SortOrderByAmount的方法是按照订单金额给订单排序,子类重写这个方法后按照订单生成时间给订单排序,那么子类函数的功能就和父类函数的功能不一致,违反里式替换原则
输入、输出、异常
比如父类的方法可以输入任何整数,但是子类的方法加了一个校验只允许输入正整数,非正整数就会返回error,输入不一致这就违法了里式替换原则
比如父类的方法数据为空时返回空列表,但是子类方法数据为空时返回nil,输出不一致这就违法了里式替换原则
比如父类的方法只会返回空指针异常,但是子类除了空指针异常还会返回其他异常,这就违法了里式替换原则
注释中的特殊说明
比如父类的WithDraw提现方法中注释里面写了:用户的提现金额不能超过余额,但是子类重写的WithDraw方法针对VIP用户实现了透支体现,和父类注释中的特殊说明冲突,违反了里式替换原则