白话解说,半分钟就懂---里氏替换原则
提出者的原话
A type hierarchy is composed of subtypes and supertypes. The intuitive idea of a subtype is one whose objects provide all the behavior of objects of another type (the supertype) plus something extra.What is wanted here is something like the following substitution property: 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.
翻译
“类型层次由子类型和超类型(也就是父类)组成,直觉告诉我们,子类型的含义就是该类型的对象提供了另外一个类型(超类型)的对象的所有行为功能,并有所扩充。这里需要如下的替换性质:若对于每一个类型S的对象o1,都存在一个类型T的对象o2,使得在所有针对T编写的程序P中,用o1替换o2后,程序P的行为功能不变,则S是T的子类型。”这就是LSP的最初含义。
简而言之
子类必须能够替换成它们的基类,在一个软件系统中,子类应该可以替换任何基类能够出现的地方,并且经过替换以后,代码还能正常工作。
举个栗子
“正方形不是长方形”是一个理解里氏代换原则的最经典的例子。在数学领域里,正方形毫无疑问是长方形,它是一个长宽相等的长方形。我们开发的一个与几何图形相关的软件系统中,让正方形继承自长方形是顺利成章的事情。
作用
子替换父,效果一样,增强健壮性。原来的可以继续使用
违反情况
子类重写父类的方法
Car car(y) = new petcar(n)
car.skill(n)
遵守情况
子:参数不同(参数范围放大 比如hashmap比Map范围小)
参数:子父不同
方法:未重写,子继承父
PS:本文原创首发于公众号「让我遇见相似的灵魂」,回复关键字获取数十本程序员经典电子书。
左手代码,右手吉他,这就是天下:如果有一天我遇见相似的灵魂 那它肯定是步履艰难 不被理解 喜黑怕光的。如果可以的话 让我触摸一下吧
它也一样孤独得太久。 不一样的文艺青年,不一样的程序猿。