gpt4 book ai didi

oop - IS-A 和 Liskov 替换原则的区别?

转载 作者:行者123 更新时间:2023-12-04 14:09:06 26 4
gpt4 key购买 nike

我只是想知道 IS-A(即 UML 术语和 OOP)和 Liskov 替换原则(LSP)之间是否有区别?

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

最佳答案

这两个术语最终都描述了相同的“概念”。

Liskov 替换原则告诉你:当 B 类对象的每个和任何用法都可以用 C 类对象替换时,B 类(基类)和 C 类(子类)之间的继承关系是合理的。

这意味着:B 定义了一个 API 和一个公共(public)合约——C 也必须维护这些属性!

和 IS-A 等同于:C 的某个对象 也是一个 B。

“区别”是:LSP 为您提供了可以检查的确切规则。而 IS-A 更多的是“观察”或意图表达。比如:你表示你希望 C 类 IS-A B。

换句话说:当您不知道如何正确使用继承时,IS-A 并不能帮助您编写正确的代码。而 LSP 清楚地告诉您类似:

class Base { int foo(); }
class Child extends Base { @Override double foo(); }

无效 .根据 LSP,您只能扩大方法参数并限制返回值。
int iValue = someBase.foo();

不能被替换
int iValue = someChild.foo();

因为 foo()方法在其结果中被拓宽。

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

C IS-A B 需要的不仅仅是“C 扩展 B”。要真正有效,LSP必须坚持!

关于oop - IS-A 和 Liskov 替换原则的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45952008/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com