LSP原则是什么

如果这篇文章能够帮到您,请给我一个免费的赞,谢谢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)

热门相关:无量真仙   仗剑高歌   明月照大江   刺客之王   寂静王冠