我对LSP的意图感到困惑。 我正在阅读实用程序程序员,并且在按合同设计的章节中,该行引用LSP。
子类必须可以通过基类接口使用,而无需用户知道它们之间的区别。
但是,如果我看看其他定义,那么似乎暗示了完全相反的事实,即实际上应该是子类可以代表基类。
有人可以澄清吗?
答案 0 :(得分:1)
这是说同一件事的两种方式。
继承是一个被滥用的概念,但是我认为不弄糟系统设计的最简单方法就是这样考虑:
继承表示子类是一个基类。考虑到这一点:
子类必须可以通过基类接口使用,而无需用户知道它们之间的区别。
如果扩展一个类,则子类必须能够替换基类。脚本必须能够像使用基类一样使用子类,而不会失败。
似乎暗示了确切的反面,实际上是应该能够代表基类的子类。
简单的混乱,意味着同一件事。子类必须能够替换基类。
更多详细信息:
子类必须可以通过基类接口[...]
使用
基类接口由其协定组成。基类定义了可以使用它的api。例如,基类Number
可以具有public method add(Number $number)
。
任何扩展类(例如Integer
)都必须能够像任何Number
一样使用,而不必修改处理数字的代码。