Функция Eiffel is_equal ()

compare comparison eiffel

340 просмотра

1 ответ

Я пытаюсь лучше понять функцию is_equal (), определенную в классе COMPARABLE .

Я хотел бы знать, в каком случае для объекта o вызов функции o.is_equal (o) выдает false .

Я знаю, что эта функция, в отличие от = , сравнивает не только адрес объектов, но и значения всех их атрибутов.

Следуя этому определению, я был почти уверен, что такой вызов всегда даст true , так как мы сравниваем один и тот же объект.

Я был бы очень признателен, если бы кто-то мог объяснить мне, что не так в моем мышлении.

Автор: DevX10 Источник Размещён: 08.11.2019 11:07

Ответы (1)


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), может быть Trueили в Falseзависимости от значений o1и o2.

Автор: Alexander Kogtenkov Размещён: 20.08.2016 10:44
Вопросы из категории :
32x32