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)