当前位置: 首页 > 知识库问答 >
问题:

弱化前置条件、强化后置条件难道也违背了利斯科夫替代原则吗?

邵阳德
2023-03-14

子类型的实际后置条件是通过组合(使用逻辑)基类型的后置条件和子类型的后置条件来创建的,这使得得到的后置条件更具限制性

以下是加强前置条件和削弱后置条件的例子,结果违反了LSP(链接):

>

  • 假设基类使用成员int。现在您的子类型要求int为正。这是强化的前提条件,现在任何以前用负整数工作得很好的代码都被破坏了。

    示例:

    基类postcondition保证方法的返回值在1-10范围内,但随后子类型将postcondition更改为只允许返回值在2-9范围内。现在,处理从该方法返回的对象的代码(并假设后置条件在1-10范围内)已经中断,因为后置条件没有得到支持。

  • 共有1个答案

    祁飞翰
    2023-03-14

    对不起,你的考虑有逻辑错误。

    基类postcondition保证方法的返回值在1-10范围内,但随后子类型将postcondition更改为只允许返回值在2-9范围内。

    由于代码在范围1-10内工作,而范围2-9实际上也在范围1-10内,因此加强后置条件应该从来不是问题。

     类似资料:
    • 我正在详细学习LSP,我确实理解为什么强化先决条件违反了这一原则(使用来自http://www.ckode.dk/programming/solid-principles-part-3-liskovs-substitution-principle/#contravariance): 在这里,我清楚地看到,对于基类有效的东西对于它的派生类将失败。换句话说,在不改变行为的情况下,我无法用基类的导数替换

    • 我认为是这样的,因为子类在被替换时的行为不像基类,而且它抛出了一个RuntimeException? 我不完全确定,我想知道我的假设是否正确

    • 现在,让我们来看看“燃料”类: 以上是完成的所有抽象类,现在让我们看看具体的实现。首先,fuel的两个具体实现,包括一些贫血接口,以便我们可以正确地键入-提示/嗅探它们: 最后,我们有了车辆的具体实现,它确保使用正确的燃料类型(接口)为特定的车辆类别加油,如果不兼容则抛出异常: null

    • 我最近一直在深入研究一些坚实的设计原则,我从一个来源获得的一些信息最初对我来说是有意义的,但基于我能够找到的关于thr LSP的严格定义,这些信息似乎不正确。具体信息如下: 1) 不在重写的方法上回调super()会违反LSP(或者至少会导致违反),因为基类的行为可能会在某个点上发生更改,并且您的子类可能会丢失该行为,从而导致子类不再可以替换父类。这对我来说似乎是有道理的,但如果有人能详细说明这一

    • 以下代码是否直接违反了Liskov替换原则: 子类不应破坏父类的类型定义。 结果如下: 致命错误:b::baz(Foo $foo)的声明必须与a::baz(Baz $baz)兼容

    • 链接 您可以将类不变量视为一个健康标准,操作之间的所有对象都必须满足该标准。作为类的每个公共操作的先决条件,因此可以假设类不变量成立。此外,可以假设它是类不变量所持有的每个公共操作的后条件。从这个意义上说,类不变量是对类中公共操作的先决条件和后决条件的一般强化。有效的前提条件是与类不变量相结合的公式化的前提条件。类似地,有效后条件是与类不变量结合的公式化后条件。 1.如果在类: a) 先决条件通常