如果这篇文章能够帮到您,请给我一个免费的赞,谢谢QWQ!

LSP原则并不难,但是地方就会把它说的很啰嗦,如果你对LSP还是感到疑惑,请往下看看。

先上代码:

public class Bird
{
public void fly(){}
}
public class Duck extends Bird{}

乍一看,这段代码没啥问题。没错啊,鸭子是鸟,当然鸭子也会飞了!

可是我举个反例:鸵鸟不是鸟吗?那鸵鸟会飞吗?明显不会。

但鸵鸟也是鸟啊,我如果让我的鸵鸟做鸟的子类,那我按你这么写必须会飞了,这不矛盾了吗?

写代码处处全是矛盾,那怎么行。。。所以计算机科学家研究出了一个原则,这就是LSP原则。

LSP原则:子类对象在程式中可以代替父类对象;(简单理解:父亲能做的,儿子也能做)

不是所有鸟都会飞。鸵鸟这个子类是无法代替父类对象的,因为它不会飞,上面这个设计违反了LSP原则。

下面我这么改,就符合LSP原则了:

public class Bird{}

public class FlyingBirds extends Bird{
public void fly(){}
} public class Duck extends FlyingBirds{}
public class Ostrick extends Birds{}

鸭子是会飞的鸟,当然也是鸟;

鸵鸟是不会飞的鸟,但是鸵鸟是鸟;

现在逻辑就顺畅多了!

一个好好利用LSP原则的代码,一般有如下特性:

1.父亲几乎啥也不会,除了一些基本活动;儿子比父亲懂得多,但是也会父亲那些基本活动(子类中增加方法,子类必须实现父类所有方法

2.父亲好好的,儿子也就好好的;父亲的病一定比儿子的重(子类型重写不能抛出额外的异常;父类型无异常,子类型重写不能有异常

这个例子来自于stackoverflow的高赞答案。有兴趣的可以去自行搜索:哎呀 - 里氏替换原理的一个例子是什么?- 堆栈溢出 (stackoverflow.com)

LSP原则是什么的更多相关文章

  1. 连载:面向对象葵花宝典:思想、技巧与实践(32) - LSP原则

    LSP是唯一一个以人名命名的设计原则,并且作者还是一个"女博士"  ======================================================== ...

  2. LSP原则—关于正方形不是长方形

    长方形有二个属性长和宽.并有一个设置长的方法和设置宽的方法,还有一个求面积的方法. 像下面 private int length; private int width; public void set ...

  3. 第2章 面向对象的设计原则(SOLID):2_里氏替换原则(LSP)

    2. 里氏替换原则(Liskov Substitution Principle,LSP) 2.1 定义 (1)所有使用基类的地方必须能透明地使用子类替换,而程序的行为没有任何变化(不会产生运行结果错误 ...

  4. Liskov替换原则(LSP)

    OCP中,继承支持了抽象和多态特性. LSP:子类必须能够替换掉其基类. 反例:使用if/else判断类型,以便选择针对特定类型的正确行为. 有效性并非本质属性 模型的有效性,只能通过它的客户程序来表 ...

  5. 六大设计原则(二)LSP里氏替换原则

    里氏替换原则LSP(Liskov Subsituation Principle) 里氏替换原则定义 所有父类出现的地方可以使用子类替换并不会出现错误或异常,但是反之子类出现的地方不一定能用父类替换. ...

  6. 深入理解JavaScript系列(8):S.O.L.I.D五大原则之里氏替换原则LSP

    前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第3篇,里氏替换原则LSP(The Liskov Substitution Principle ). 英文原文:http ...

  7. 七、LSP 里氏替换原则

    子类的对象提供了父类的所有行为,且加上子类额外的一些东西(可以是功能,可以是属性).当程序基于父类实现时,如果将子类替换父类而程序不需修改,则说明符合LSP原则. 这个解释看的似懂非懂,再看下面更进一 ...

  8. Liskov替换原则(LSP)

    OCP背后的主要机制是抽象和多态.在静态类型语言中,比如C++和Java,支持抽象和多态的关键机制之一是继承.正是使用了继承,才可以创建实现其基类中抽象方法的派生类.是什么设计规则在支配着这种特殊的继 ...

  9. Java程序员应该了解的10个面向对象设计原则

    面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...

随机推荐

  1. java基础-多线程-线程组

    线程组 * Java中使用ThreadGroup来表示线程组,它可以对一批线程进行分类管理,Java允许程序直接对线程组进行控制. * 默认情况下,所有的线程都属于主线程组.  * public fi ...

  2. IO流的简单实现

    IO流的几种实现方式 学习目标: 例题: 字节输出流 字节输入流 字符输入流 字符输出流 学习目标: 熟练掌握IO流的基本实现方式 例题: 字节输出流 代码如下: public class Outpu ...

  3. 《头号玩家》AI电影调研报告(二)

    四. 涉及前沿技术及与现实的交互 1.VR技术 在影片中,斯皮尔伯格用他认为未来的VR虚拟技术为我们创造了众多精彩的画面,令人佩服其对科技的预见性.其中好多的装备特别引人注目,部分也在现实中存在:VR ...

  4. C语言之:结构体动态分配内存(利用结构体数组保存不超过10个学生的信息,每个学生的信息包括:学号、姓名和三门课(高数、物理和英语 )的成绩和平均分(整型)。)

    题目内容: 利用结构体数组保存不超过10个学生的信息,每个学生的信息包括:学号.姓名和三门课(高数.物理和英语 )的成绩和平均分(整型). 编写程序,从键盘输入学生的人数,然后依次输入每个学生的学号. ...

  5. IsDebuggerPresent的反调试与反反调试

    一.调用系统的IsDebuggerPresent函数 (1)实现程序 最简单也是最基础的,Windows提供的API接口:IsDebuggerPresent(),这API实际上就是访问PEB的Bein ...

  6. el-menu菜单 -- unique-opened 子菜单唯一性失效

    总结: 点击的是  el-sub-menu . 所以  el-sub-menu 的唯一性是必须的.否则 unique-opened 属性不生效

  7. 【简单dfs】Bubble Cup 14 - Finals Online Mirror (Unrated, ICPC Rules, Teams Preferred, Div. 2), problem: (J) Robot Factory,

    传送门  Problem - 1600J - Codeforces 题目   题意 给定n行m列, 求每个连通块由多少格子组成,并将格子数从大到小排序输出 对于每个格子都有一个数(0~15),将其转化 ...

  8. HCIE笔记-第五节-IP地址+VLSM

    192.168.1.111 -- 点分十进制 -- IPV4地址表示格式 计算机 只能识别 01010101 二进制 4组十进制数 规则:二进制0/1 在不同位表达的含义是不一致的,0永远代表不取值, ...

  9. A标签上使用onclick事件,js函数响应成功,单会刷新当前页面陷阱

    BEGIN; 最近在做html页面时,有时候会遇到以前没遇到的各种奇葩问题. 目前要记载的,就是其中之一. 我们在写链接的时候,即A标签,最普通的写法无非是 <a href='http://ww ...

  10. Navicat导出结果显示科学计数法(PostgreSQL)

    原因:在EXCEL录入数超过11位,就会变成科学记数法 解决方案: 在postgresql需要导出的列中加入制表符 示例: SELECT 6280920221390000000061:: TEXT | ...