Eli*_*der 4 oop eiffel code-contracts
在埃菲尔说,我们应该"放松前提条件并收紧后期条件",但我不确定这意味着什么.这种好处/如何受益于子类别?
谢谢
在按合同设计中,您可以为函数指定一组前置条件和一组后置条件.例如,假设您正在编写内存分配函数.您需要它接受一个正整数作为输入,并生成一个均匀对齐的指针作为其结果.
松散前置条件意味着在创建派生类时,它必须接受基类可以接受的任何输入,但也可以接受其他输入.使用上面的示例,可以编写派生类以接受非负整数而不仅仅是正整数.
在结果方面,您必须确保派生函数的结果满足基函数的所有要求 - 但它也可以添加更多限制.例如,上述函数的派生版本可能决定只生成8的倍数结果.8的每个倍数显然是均匀的,因此它仍然满足基函数的要求,但也施加了额外的限制.
相反的方法不起作用:如果基类函数允许非负整数作为输入,则派生类必须继续接受所有非负整数作为输入.尝试将其更改为仅接受正整数(即拒绝0,这是基类允许的)将不被允许 - 在任何情况下,您的派生类都不能再替换基本版本.
与结果类似:如果基类对结果施加"8的倍数"要求,则派生版本还必须确保所有结果都是8的倍数.返回2或4将违反该要求.