IS-A和Liskov替代原则之间的区别?

Ahm*_*yan 6 oop inheritance liskov-substitution-principle solid-principles

我只是想知道IS-A(UML术语和OOP)和Liskov替换原则(LSP)之间是否存在差异?

实际上,两者都在谈论继承.那么实践中的主要区别是什么?

Gho*_*ica 9

这两个术语最终都描述了相同的"概念".

里氏替换原则告诉你:对类B(碱)和C(子)之间的继承关系是声音时,每个和B型的一些对象的任何用法可...与类型C的对象替换

这意味着:B定义了API和公共合同--C也必须维护这些属性!

并且IS-A相同:C的某个对象也是 B.

"差异"是:LSP为您提供可以检查的确切规则.而IS-A更像是一种"观察"或意图表达.比如:你表示你希望 C级-A B级.

换句话说:当您不知道如何正确使用继承时,IS-A无法帮助您编写正确的代码.LSP清楚地告诉你类似的东西:

class Base { int foo(); }
class Child extends Base { @Override double foo(); }
Run Code Online (Sandbox Code Playgroud)

无效的.据LSP,你只能扩大方法的参数,并限制返回值.

int iValue = someBase.foo();
Run Code Online (Sandbox Code Playgroud)

不能替代

int iValue = someChild.foo();
Run Code Online (Sandbox Code Playgroud)

因为该foo()方法的结果扩大了.

最后一个想法是:很多人认为C IS-A B 写下来是一样的Child extends Base.是.但这只告诉编译器C扩展B.这并不意味着你在C中使用的方法将遵循LSP,从而将C转换为B 的真实有效后代.

C IS-A B 需要的不仅仅是"C延伸B".要真正有效,LSP必须坚持!