Re[9]: Вызов "неизвестного" метода Equals из шаблона
От: KA it-knowledge-base.blogspot.com
Дата: 05.01.11 19:55
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

KA>>Оказывается, метод попроще ...

KA>> реализуется через интерфейс IEquatable<T>.
KA>>Ранее приведенный кусок кода надо дополнить всего парой строк (выделены жирным шрифтом), а именно:
KA>>
KA>>  class Super : IBase, System.IEquatable<Super>
KA>>  {
KA>>    public void Everything() { }
KA>>    public bool Equals(Super other) { return true; }
KA>>  }
KA>>}

HL>До конца не дочитали?
HL>

HL>Примечания для разработчиков

HL>Если реализуется интерфейс IEquatable<T>, следует также переопределить реализацию базового класса для методов Object.Equals(Object) и GetHashCode, чтобы их поведение соответствовало поведению метода IEquatable<T>.Equals.

HL>Нифига это не проще. См. здесь
Автор: Sinix
Дата: 03.01.11
:

HL>

HL>Для простых случаев проще использовать свой IEqualityComparer<IBase>


Эээ... спасибо за подсказку.
Хоть это и не следует из приведенного мною фрагмента кода, в моём случае идёт сравнение только однотипных объектов, т.е. я не собираюсь сравнивать Super с каким-то гипотетическим классом Super2, а только Super — c Super'ом, и Super2 — c Super2.
Если же пользователь захочет сравнивать через Equals(Object), то эту вредную наклонность проще пресечь сокрытием данного метода, или выбрасыванием исключения, ибо нефиг (это не имеет смысла в предметной области, которая моделируется программой).

EqualityComparer — интересный класс. Возможно, его применение и оправдано в более сложных случаях. Пока что я не вижу необходимости выносить сравнение из Super.Equals(Super) в EqualityComparer.Equals(Super,Super).
//
#import <windows.bas>
class IWindows9x:protected DOS { private: virtual HANDLE EnumClouds()=0; };
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.