Eiffel is_equal()函数

时间:2016-08-20 09:32:07

标签: compare comparison eiffel

我试图更好地理解在比较类中定义的函数 is_equal()

我想知道在哪种情况下,对象 o 函数调用 o.is_equal(o) 给出

我知道这个功能与 = 不同,不仅可以比较对象的地址,还可以比较所有属性的值。

按照这个定义,我非常确定这样的调用总是会给出 true ,因为我们正在比较同一个对象。

如果有人能解释我的想法有什么不妥,我真的很感激。

1 个答案:

答案 0 :(得分:1)

目前,功能is_equal的来源是课程ANY,而不是COMPARABLE。类COMPARABLE重新定义了该功能,并添加了一个后置条件trichotomy,它根据不等式(或者,根据查询is_less更精确地指定了相等的属性)。因此,要了解正在发生的事情,让我们看一下原点。

班级ANY有一个不变的

reflexive_equality: standard_is_equal (Current)

同时,功能is_equal具有后置条件

consistent: standard_is_equal (other) implies Result

将两者结合起来(即使不知道什么是standard_is_equal)我们可以得出一个新的不变量

new_reflexive_equality: is_equal (Current)

应该对每个对象都有效。因此,只要表达式中的o始终产生相同的对象(例如,如果它是变量,而不是在每次调用时返回不同对象的函数), o.is_equal (o)应该始终产生True 。当然,可以尝试重新定义is_equal以返回False,但这会破坏该功能的合同。

在现实生活中,比较通常为o1.is_equal (o2),可以是TrueFalse,具体取决于o1o2的值。