是什么
子类对象可以替换程序中父类对象出现的任何地方,并且保证原有程序逻辑的正确性不被破坏。
比如我们在实际开发中定义了数据读取的父类,子类可以进行在此功能的拓展、增强但是不能修改原有的内在含义。
里氏替换原则和多态的区别,多态是面向对象编程中一个特性,是用来在具体代码实现的思路,但是里氏替换原则是一种设计原则,是用来指导继承关系中子类该如何设计,保证子类可以替换父类。
如何设计
其实就是按照协议来设计,Design By Contract。子类设计的时候,都要遵循父类函数的行为约定,不修改具体原来的定义。包括功能,接口输入、输出参数,异常约定等。
站在父类的角度思考,去设计子类。
1.子类不能违背父类要实现的功能。
2.子类按照要求实现对输入、输出、异常的约定
3.子类不违背父类所罗列的任何特殊说明
public interface ThirdApiCall {String call(String xxx);}abstract class BaseThirdApiCall implements ThirdApiCall {abstract void before();abstract void after();@Overridepublic String call(String xxx) {before();System.out.println("三方前置调用");after();return null;}
}class BaiduThirdApiCall extends BaseThirdApiCall {@Overridevoid before() {System.out.println("baidu 前置调用");}@Overridevoid after() {System.out.println("baidu 后置调用");}@Overridepublic String call(String xxx) {return super.call(xxx);}
}
子类必须能够替换成它们的基类。即子类应该可以替换任何基类能够出现的地方,并且经过替换以后,代码还能正常工作。另外,不应该在代码中出现 if/else 之类对子类类型进行判断的条件。里氏替换原则 LSP 是使代码符合开闭原则的一个重要保证。正是由于子类型的可替换性才使得父类型的模块在无需修改的情况下就可以扩展。