1

我一直在阅读按合同设计的主题,到目前为止,我写了以下注释:

When strengthening a condition, it means to make it 
more restrictive and weakening a condition is the opposite. 

A subclass' pre-condition is either weaker or the same as its super class'
A subclass' post-condition is either stronger or the same as its super class'

我想确认一个例子来澄清我的理解。

class exampleA {
    int processInt(int exampleInt) {
        return exampleInt;
    }
}

class exampleB extends exampleA {
    int processInt(int exampleInt) {
        return exampleInt;
    }
}

契约式设计说如果 in 的前置条件是“必须大于 10”,后置条件是“返回值在 20 到 50 之间”,那么' 方法的前置条件必须相同或更弱,并且后置条件将相同或更强。processIntexampleAexampleIntexampleBexampleInt

这意味着exampleB可能的有效前提条件是,

  • 大于 0
  • 大于或等于 0
  • 大于 -100

但无效的先决条件是,

  • 大于 20
  • 在 20 到 500 范围内

同样,有效的后置条件可能是,

  • 25 至 45 岁之间
  • 30 到 40 之间

但无效的后置条件是,

  • 20 到 90 之间
  • 0 到 50 之间
  • 大于 0

这是对合同设计的正确解释吗?另外,我正在用 Java 学习这个,但我认为这个概念适用于任何带有 OOP 的语言?

4

1 回答 1

1

是的,你的例子是正确的;是的,同样的概念适用于任何支持多态的语言。请注意,按合同设计也是Liskov 替换原则的一部分,该原则对子类型规定了更多限制。

于 2021-11-20T16:42:54.053 回答