里氏代换原则:
一个软件实体如果使用一个基类的话,那么一定适用于其子类,而且这根本不能察觉出基类对象和子类对象的区别。
里氏代换原则是继承复用的基石。只有当衍生类可以替换掉基类,软件单位的功能不会受到影响时,基类才能真正的被复用,而衍生类也才能够在基类的基础上增加新的行为。
Java语言对里氏代换原则的支持:
里氏代换原则要求凡是基类型使用的地方,子类型一定适用,因此子类型必须具备基类型的全部接口。或者说,子类型的接口必须包括全部的基类型的接口,而且还有可能更宽。如果一个java程序破坏这一条件,JAVA编译器会给出编译时错误。
Java语言对里氏代换原则支持的局限:
JAVA编译器不能检查一个系统在实现和商业逻辑上是否满足里氏代换。
里氏代换原则在设计模式中的体现:
1. 策略模式:策略模式的策略间的互换性是对里氏代换原则的遵守。
2. 合成模式:里氏代换原则是合成模式能够成立的基础。
3. 代理模式:代理模式能够成立的关键,就在于代理模式与真实主题模式都是抽象主题角色的子类。
从代码重构角度看里氏代换原则:
里氏代换原则讲的是基类与子类的关系,只有当这种关系存在时,里氏代换原则才存在,反之不存在。假设有A、B两个类违反了里氏代换原则的设计,可以使用下面2种重构方案找选择一种处理:
1. 创建一个新的抽象类C,作为两个具体类的超类,将A和B的共同行为移动到C中,从而解决A和B行为不完全一致的问题。
2. 从B到A的继承关系改写为委派关系。