埃菲尔:放松前提条件并收紧后期条件?

时间:2010-09-10 00:24:55

标签: oop code-contracts eiffel

在埃菲尔铁塔,我们应该“放松前提条件并收紧后期条件”,但我不确定这意味着什么。这种好处/如何受益于子类别?

谢谢

1 个答案:

答案 0 :(得分:7)

在按合同设计中,您可以为函数指定一组前置条件和一组后置条件。例如,假设您正在编写内存分配函数。您需要它接受一个正整数作为输入,并产生一个均匀对齐的指针作为结果。

放宽前提条件意味着在创建派生类时,它必须接受基类可以接受的任何输入,但可能也接受其他输入。使用上面的示例,可以编写派生类来接受非负整数,而不仅仅是正整数。

在结果方面,您必须确保派生函数的结果满足基函数的所有要求 - 但它也可以添加更多限制。例如,上述函数的派生版本可能决定只生成8的倍数结果.8的每个倍数显然是均匀的,因此它仍然满足基函数的要求,但也施加了额外的限制。

相反的方法不起作用:如果基类函数允许非负整数作为输入,则派生类必须继续接受所有非负整数作为输入。尝试将其更改为仅接受正整数(即拒绝0,基类允许) - 在任何情况下都不能再使用派生类替换基本版本。

与结果类似:如果基类对结果施加了“8的倍数”要求,则派生版本还必须确保所有结果都是8的倍数。返回2或4将违反该要求。

相关问题