如何扩展埃菲尔的功能要求条件?

时间:2017-01-10 18:36:12

标签: contract eiffel

我有一个类,它重新定义了ANY的复制功能。我想添加一个新的require条件,但是我收到了这个错误:

Assertion in redeclaration uses just 'require' or 'ensure'. invalid precondition feature 'copy'

代码:

copy ( other : like Current )
require
    size_is_enough: Current.max_size >= other.count
do
    -- ...
end

说明:

这个类包含一个数组,如果对象有足够的空间,我想在复制前检查

1 个答案:

答案 0 :(得分:3)

使用需要其他代替需要,可以在Eiffel中削弱功能重新声明的前提条件(对于后置条件,它将确保而不是的确保)。新的有效前提是原始的和新的组合。例如,如果有功能

foo
    require
        A

重新声明为

foo
    require else
        B

那么有效的前提条件是A or else B。换句话说,重新声明的前提条件总是比原始特征弱。

同样适用于特征copy的前提条件:它只会变弱。这意味着您无法检查当前对象的数组大小是否大于另一个的数组大小。只有当不满足原始前提条件时,即当另一个对象的类型与当前对象的类型不同时,才会检查重新声明的前提条件。换句话说,你正试图加强前提条件,这是不可能的。

一种选择是使用不同的功能而不是copy,另一种选择是根据需要调整当前对象的存储大小。在这两种情况下,特征copy的前提条件保持不变。