这是我之前对于面向对象6大原则的学习笔记,其中对里氏替换原则的理解不够深刻,https://blog.51cto.com/zhangzhao/2396810。
根据百度百科的资料,里氏替换原则的定义为:Liskov于1987年提出了一个关于继承的原则“Inheritance should ensure that any property proved about supertype objects also holds for subtype objects.”——“继承必须确保超类所拥有的性质在子类中仍然成立。”也就是说,当一个子类的实例应该能够替换任何其超类的实例时,它们之间才具有is-A关系。
简单来说,就是当子类替换其基类的时候,程序的行为没有发生任何变化。
这就要求:
1. 子类可以实现父类的抽象方法,但是不能重写父类的非抽象方法。(这里需要区分下重写和重载的概念,重写是指函数名相同,函数的签名或者说参数类型相同;而重载是函数名相同,函数的签名或者说参数类型不同,面向对象语言的多态性会在运行时根据传入的实参类型自动匹配最适合的函数进行调用)
2. 子类可以增加自己的特性。
3. 子类的在重载父类方法时,方法的前置条件(形参)要比父类方法的输入参数更宽松。这是因为如果子类方法的参数范围更小的话,在运行调用函数的时候,可能就会先调用子类的重载函数,这是违反里氏替换原则的。
4. 重载父类方法时输出结果(返回值)可以被缩小。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。