如何在 Eiffel 中扩展功能的需求条件?

How to extend a feature's require conditions in Eiffel?

我有一个 class,它重新定义了 ANY 的复制功能。我想添加一个新的要求条件,但出现此错误:

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

说明:

这个 class 包含一个数组,我想在复制之前检查对象是否有足够的 space 给它们

Eiffel 中可以通过使用 require else 代替 require 来削弱功能重新声明中的前提条件(对于后置条件,它将是 确保然后而不是确保)。新的有效前提条件将是原始前提条件和新前提条件的组合。例如,如果有一个特征

foo
    require
        A

重新声明为

foo
    require else
        B

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

特征的前提也是如此copy:只能变弱。这意味着您无法检查当前对象的数组大小是否大于另一个对象的数组大小。重声明的前置条件只有在不满足原始前置条件时才会被检查,即当另一个对象的类型与当前对象的类型不同时。换句话说,你是在强化前提条件,这是不可能的。

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