设计原则-里氏替换原则(Liskov Substitution Principle LSP)

意图
规定继承
定义1:如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。
定义2:所有引用基类的地方必须能透明地使用其子类的对象。
继承:在之类中尽量不要重载和覆盖父类中非抽象的方法
解决方案:当使用继承时,遵循里氏替换原则。类B继承类A时,除添加新的方法完成新增功能P2外,尽量不要重写父类A的方法,也尽量不要重载父类A的方法。

里氏替换原则:任何基类可以出现的地方,子类一定可以出现。LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。LSP是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏替换原则是对实现抽象化的具体步骤的规范。
缺点
继承的缺点(程序容易侵入、降低可移植性、增加耦合度、修改父类是需要考虑之类)
要求
子类可以扩展父类的功能,但不能改变父类原有的功能及:
1.子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
2.子类中可以增加自己特有的方法。
3.当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
4.当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。
其他
静态类型:就像被声明时的类型
动态类型:创建对象时的类型
静态分派:编译期,只有对象的静态类型是有效的,因此静态分派是根据对象(包括参数对象)的静态类型选择方法(方法重载)
动态分派:运行期,根据对象的实际类型选择方法(方法的重写)
Java:编译时使用静态类型选择方法,运行时根据方法所属对象的实际类型确定方法;Java语言支持静态多分配和动态单分派,可以使用instanceof实现动态多分派。
但是在使用的时候最好遵守里氏替换原则

转载于:https://my.oschina.net/sld880311/blog/1485948

你可能感兴趣的:(设计原则-里氏替换原则(Liskov Substitution Principle LSP))