4

在埃菲尔,有人说我们应该“放松前置条件,收紧后置条件”,但我不知道这是什么意思。子分类如何受益/受益?

谢谢

4

1 回答 1

7

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

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

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

反之则行不通:如果基类函数允许非负整数作为输入,那么派生类必须继续接受所有非负整数作为输入。尝试将其更改为仅接受正整数(即拒绝 0,这是基类允许的)是不允许的——在任何情况下,您的派生类都不能再替换基版本。

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

于 2010-09-10T04:52:10.690 回答