面象对象设计6大原则之三:里氏替换原则

里氏替换原则(LSP),The Liskov Substitution Principle

定义 所有引用基类的地方必须能透明地引用其子类的对象,即子类可以拓展父类的功能,但不能修改父类已有的功能。

也就是说在父类出现的地方子类也可以出现,并且替换为子类也不会报错,引用者根本不需要知道引用的是父类还是子类,但是反过来就行不通了,子类出现的地方父类就不一定能出现并代替子类。

里氏替换原则的特点:

1、子类可以拓展父类的功能,但不能修改父类已有的功能,如果修改了父类已有的功能,可能导致父类定义的功能在子类覆盖后不适用。

2、重载父类的方法时,子类的方法形参应该比父类更宽松。

3、实现父类的抽象方法时,子类的方法输出结果应该比父类更加严格。

4、子类可以有自己独特的私有方法,但是需要注意的是,如果子类不能完全实现父类的方法,或者父类的某一些方法在子类中已经不适用,这种情况则建议断开父子关系,使用组合等方式代替继承出现。

里氏替换原则的优缺点:

1、合理得用类的继承关系,提高了代码的复用性,但也增强了类与类之间的耦合性。

2、通过建立抽象,运行过程中具体实现取代抽象,保证了系统的可拓展性。

3、只要继承父类就拥有父类的全部属性和方法,这样减少了代码重复创建量共享了代码但也约束了子类的行为,降低了系统灵活性。

我们平时开发中可能没考虑这么多,乱覆盖父类的方法,没有多少联系的继承等很多打破了里氏替换的原则,这样不顾后果的后果就是我们写的程序存在着潜在的漏洞,而且出问题的机率也会显著提升。

原文发布于微信公众号 - Java技术栈(javastack)

原文发表时间:2017-06-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

Python编程中的反模式

这篇文章收集了我在Python新手开发者写的代码中所见到的不规范但偶尔又很微妙的问题。

1012
来自专栏我是攻城师

你不知道的Java的split的小问题

2796
来自专栏C语言及其他语言

[每日一题]排列

题目描述 有4个互不相同的数字,输出由其中三个不重复数字组成的排列。 输入 4个整数。 输出 所有排列 样例输入 1 2 3 4 样例输出 1 2 3 1 3 ...

3597
来自专栏java达人

Java 8 Stream 教程 (三)

作者:Benjamin 译者:java达人 来源:http://winterbe.com/posts/2014/07/31/java8-stream-tuto...

2186
来自专栏SHERlocked93的前端小站

JS 原型模式

原型模式(Prototype pattern),用原型实例指向创建对象的类,使用于创建新的对象的类的共享原型的属性与方法。

1491
来自专栏个人随笔

设计模式(1)

  注:本文章示例为C#代码,设计模式通用任何编程语言,可放心阅读 设计模式(3W1H)   What?针对特定问题特出的特定的解决方案   Why?让程序有更...

32011
来自专栏编程

Python精华之函数

各位小伙伴,大家周一快乐! 不知道刚刚过去的周末大家过的怎么样? 反正常老师是被糊里糊涂的过了个圣诞节 满大街的商场和超市都张灯结彩,话说,不是有规定不让过这种...

2025
来自专栏Crossin的编程教室

【Python 第17课】 类型转换

昨天又被微信后台给坑了,导致有些同学收了2遍消息。希望今天能顺利发成功。。。 #==== 类型转换 ====# python的几种最基本的数据类型,我们已经...

2776
来自专栏angularejs学习篇

js中对arry数组的各种操作小结

  最近工作比较轻松,于是就花时间从头到尾的对js进行了详细的学习和复习,在看书的过程中,发现自己平时在做项目的过程中有很多地方想得不过全面,写的不够合理,所以...

1382
来自专栏北京马哥教育

Python编程中的反模式

云豆贴心提醒,本文阅读时间7分钟 这篇文章收集了我在Python新手开发者写的代码中所见到的不规范但偶尔又很微妙的问题。 本文的目的是为了帮助那些新手开发者渡...

3547

扫码关注云+社区