在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
答案 0 :(得分:1)
仅当两个对象属于同一类型时,才会应用逐字段比较。如果它们的类型不同,则相等运算符给出错误。换句话说,扩展类型的等于运算符=
与具有语义的等于运算符~
相同
type_of (a) = type_of (b) and then a.is_equal (b)
因此both_are_equal
会给False
。
结果将是相同的,如果不是a
和b
扩展类型,那么引用类型的x
和y
会附加到展开的对象 - 比较将对象的类型考虑在内:
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中特定比较要素的合同中找到。