里氏替换原则-正方形是长方形?
刚刚看到了网上关于里氏替换原则的一个经典示例:“正方形是长方形的子类,这个说法对吗”?首先,说答案,这种说法不满足里氏替换原则。,为什么这个问题的答案是“这种说法不满足里氏替换原则”而不是“错”呢?因为在数学的观念里,正方形属于特殊的长方形,也就是说长和宽都相等的长方形,这种说法在数学里是没有问题的,所以引申到里氏替换原则中,是否也是成立的呢?
首先看一下百度词条对里氏替换原则的定义:
“在面向对象的程序设计中,里氏替换原则(Liskov Substitution principle)是对子类型的特别定义。它由芭芭拉·利斯科夫(Barbara Liskov)在1987年在一次会议上名为“数据的抽象与层次”的演说中首先提出。里氏替换原则的内容可以描述为: “派生类(子类)对象可以在程式中代替其基类(超类)对象。” 以上内容并非利斯科夫的原文,而是译自罗伯特·马丁(Robert Martin)对原文的解读”。
也就是说子类要保证能够完全代替父类出现在父类可以出现的任何地方,所以子类的实现一定是要在继承父类所有方法的前提下进行自我拓展,子类的拓展条件是要比父类的拓展条件更为宽松的,然而长方形明明只有长和宽相等时才是正方形,所以正方形作为子类并没有更宽松的拓展条件,并不能出现在长方形可以出现的所有地方。因此这个说法并不满足里氏替换原则。
我看网上有些说法也都阐述了这一观点可缘由,举了很多例子,什么“白马非马”呀啥的,其实越说越绕,越解释越混乱,就是记住一句话,“**子类要保证能够完全代替父类出现在父类可以出现的任何地方”**才是满足里氏替换原则,否则则不满足。
个人理解,如有偏差或者错误的地方还请大佬指导!!!