Eiffel:没有字段的扩展类是`=`或不是?

时间:2016-11-13 23:53:47

标签: operators eiffel

在Eiffel中,如果比较扩展类型的对象,=运算符将逐字段对它们进行比较,检查两个对象中每个字段的内容是否相同。

让我们设想两个扩展的类,其中没有定义任何功能:

expanded class A
end

expanded class B
end

埃菲尔怎么能把他们分开?或者不是吗?是否与从ANY继承的某些字段有关?

both_are_equal: BOOLEAN
    local
        a: expanded A
        b: expanded B
    do
        Result := a = b
    end

1 个答案:

答案 0 :(得分:1)

仅当两个对象属于同一类型时,才会应用逐字段比较。如果它们的类型不同,则相等运算符给出错误。换句话说,扩展类型的等于运算符=与具有语义的等于运算符~相同

type_of (a) = type_of (b) and then a.is_equal (b)

因此both_are_equal会给False

结果将是相同的,如果不是ab扩展类型,那么引用类型的xy会附加到展开的对象 - 比较将对象的类型考虑在内:

both_are_equal: BOOLEAN
    local
        a: expanded A
        b: expanded B
        x: ANY
        y: ANY
    do
        x := a
        y := b
        Result := x = y -- Gives False
    end

但是如果引用表达式附加到相同类型的扩展对象,则使用逐字段比较,而不是引用相等:

both_are_equal: BOOLEAN
    local
        a: expanded A
        b: expanded A -- Note the type change
        x: ANY
        y: ANY
    do
        x := a
        y := b
        Result := x = y -- Gives True even though x and y are different objects
    end

关于等式运算符的一些细节可以在Standard ECMA-367(第8.21节)和类ANY中特定比较要素的合同中找到。