不能削弱先决条件和加强后置条件也违反Liskov替代原则吗?

Edv*_*usj 9 inheritance liskov-substitution-principle preconditions post-conditions

子类型的实际前提是通过(使用逻辑组合创建的OR)的基类型的先决条件亚型的先决条件,这使得所得的先决条件 的限制较少

子类型的实际后置条件是通过(使用逻辑组合创建的AND)碱型的后置一个亚型的后置条件,这使得所得的后置条件 更严格的

以下是加强前提条件弱化后置条件的例子,因此违反了LSP(Link):

  1. 假设您的基类使用成员int.现在你的子类型要求int为正数.这是强化前置条件,现在任何在使用负数之前完全正常工作的代码都会被破坏.

  2. 同样,假设相同的场景,但基类用于保证成员在被调用后是正面的.然后子类型更改行为以允许负的int.由于不支持后置条件,因此对该对象起作用的代码(并假设后置条件为正int)现在已被破坏.

a)当重写方法削弱前提条件时,为什么它也不被视为违反LSP ,因为此方法可以使用基类型合约不可接受的参数.因此,我们不能声称违反了基本类型的合同,因此LSP也被违反了吗?

乙)为什么是不是也认为是违反LSP时覆盖的方法加强后置条件,因为客户端调用此方法将只接收的原始方法的可能结果的一个子集.因此,我们不能声称违反了基本类型的合同,因此LSP也被违反了吗?

例:

基类后置条件保证方法的返回值在范围内1-10,但子类型后置条件更改为仅允许返回值在范围内2-9.现在,由于不支持后置条件,因此破坏了从此方法返回的对象的代码(并假设后置条件在一个范围内1-10).

eyt*_*nfb -1

我认为你的例子在以下意义上不支持你的观点。

在负int、正int的例子中,添加负数虽然包含了更多的可能性,但削弱了后置条件的保证。你的例子做了同样的事情。虽然它保证了更严格的范围,但它仍然削弱了基类提供的后置条件的保证。

后置条件规则实际上是这样说的:

该规则表明,子类型方法提供的内容比超类型方法多:当它返回超类型方法将提供的所有内容时,都得到保证,并且可能还有一些附加效果(Java 中的程序开发,第 177 页)

您的示例并不能保证超类型所保证的一切。我想在你的例子中,强化意味着子类型保证返回的 int 在 1-10 之间,而且它保证返回的 int 在 2-9 之间,而不仅仅是第二个。