六大设计原则之二_里氏替换原则(LSP)

来源:互联网 发布:unity vr源码 编辑:程序博客网 时间:2024/05/09 06:11


里氏替换法则有两种定义: 

第一个定义,最正宗的定义:If for each object o1 of type S there is an object  o2 of type T 
such that for all programs P defined in terms of T, the behavior of P is unchanged when o1 is 
substituted for o2 then S is a subtype of T. 
如果对每一个类型为 T1 的对象 o1,都有类型为 T2 的对象 o2,使得以 T1 定义的所有程序 P 在所有的
对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。 

第二个定义,functions that use pointers or references to base classes  must be able to use 
objects of derived classes without knowing it. 

所有引用基类的地方必须能透明地使用其子类的对象。 


意思就是说,父类出现的地方,之类就可以出现,而且不会影响程序的功能。但是之类能出现的地方,父类就不一定可以出现。


问题由来:有一功能P1,由类A完成。现需要将功能P1进行扩展,扩展后的功能为P,其中P由原有功能P1与新功能P2组成。新功能P由类A的子类B来完成,则子类B在完成新功能P2的同时,有可能会导致原有功能P1发生故障。

解决方案:当使用继承时,遵循里氏替换原则。类B继承类A时,除添加新的方法完成新增功能P2外,尽量不要重写父类A的方法,也尽量不要重载父类A的方法。



里氏替换原则通俗的来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能。包含以下4层含义:

1.之类必须完全的实现父类的方法;

2.之类可以有自己的个性,意思就是说子类可以按照需要增加自己的属性和方法;

3.覆盖或实现父类方法的时候输入参数可以被放大(子类中方法的前置条件必须与超类中被覆盖的方法的前置条件相同或
者更宽松);

4.覆盖或实现父类的方法是输出结果可以被缩小。