gpt4 book ai didi

java - 在这种情况下我可以违反LSP(里氏替换)吗?

转载 作者:太空宇宙 更新时间:2023-11-04 08:25:38 25 4
gpt4 key购买 nike

我有一个模型抽象类,它声明一个项目列表。抽象有两个抽象类。一种是您可以将新项目添加到列表中,另一种是根本不使用列表,但遵守模型抽象类的其他行为。

我声明了两种方法来添加和删除列表中的项目。显然,每当我想使用这些方法时,我都需要将模型抽象与其子类进行转换。

我可以违反LSP (Liskov substitution principle)吗?在这种情况下?或者有办法解决这个问题吗?

最佳答案

我认为你会违反 LSP。

来自Wikipedia page for LSP (那永远是你的 friend ;):

“更正式地说,里氏替换原则 (LSP) 是子类型关系的特定定义,称为(强)行为子类型”

“行为子类型是比类型论中定义的典型函数子类型更强大的概念,它仅依赖于参数类型的逆变性和返回类型的协变。行为子类型一般来说是不可判定的”

看起来与您的情况相似:

“违反 LSP 的一个典型示例是从 Rectangle 类派生的 Square 类,假设宽度和高度都存在 getter 和 setter 方法。Square 类始终假设宽度与高度相等。如果在需要 Rectangle 的上下文中使用 Square 对象,则可能会发生意外行为,因为 Square 的尺寸无法(或者更确切地说不应该)独立修改。这个问题不容易解决:如果我们可以修改 Square 类中的 setter 方法,以便它们保留 Square不变(即保持尺寸相等),那么这些方法将削弱(违反)矩形 setter 的后置条件,该条件规定尺寸可以独立修改。像这样的 LSP 违反在实践中可能会或可能不会成为问题”

关于java - 在这种情况下我可以违反LSP(里氏替换)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8602401/

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