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

person g4v3    schedule 13.11.2016    source источник


Ответы (1)


Сравнение полей за полем применяется только в том случае, если оба объекта относятся к одному типу. Если они относятся к разным типам, оператор равенства дает false. Другими словами, оператор равенства = для расширенных типов идентичен оператору равенства ~ с семантикой

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

Некоторые сведения об операторах равенства можно найти в Стандарте ECMA-367 (раздел 8.21) и в контрактах конкретных функций сравнения в классе ЛЮБОЙ.

person Alexander Kogtenkov    schedule 14.11.2016
comment
Спасибо за ответ! Не могли бы вы просто добавить ссылку на документацию для дальнейшего чтения? - person g4v3; 19.11.2016
comment
@ g4v3 g4v3, я добавил пару ссылок в конце ответа. На данный момент стандарт немного устарел, но основные моменты остаются в силе. Ссылка на исходный код класса ANY полностью актуальна. - person Alexander Kogtenkov; 19.11.2016