里斯科夫替代原理的困惑

时间:2018-08-17 04:00:15

标签: oop liskov-substitution-principle

我对LSP的意图感到困惑。 我正在阅读实用程序程序员,并且在按合同设计的章节中,该行引用LSP。

子类必须可以通过基类接口使用,而无需用户知道它们之间的区别。

但是,如果我看看其他定义,那么似乎暗示了完全相反的事实,即实际上应该是子类可以代表基类。

有人可以澄清吗?

1 个答案:

答案 0 :(得分:1)

这是说同一件事的两种方式。

继承是一个被滥用的概念,但是我认为不弄糟系统设计的最简单方法就是这样考虑:

继承表示子类是一个基类。考虑到这一点:

  

子类必须可以通过基类接口使用,而无需用户知道它们之间的区别。

如果扩展一个类,则子类必须能够替换基类。脚本必须能够像使用基类一样使用子类,而不会失败。

  

似乎暗示了确切的反面,实际上是应该能够代表基类的子类。

简单的混乱,意味着同一件事。子类必须能够替换基类。


更多详细信息:

  

子类必须可以通过基类接口[...]

使用

基类接口由其协定组成。基类定义了可以使用它的api。例如,基类Number可以具有public method add(Number $number)

任何扩展类(例如Integer)都必须能够像任何Number一样使用,而不必修改处理数字的代码。