Сравниваемый тип данных передается ему в качестве аргумента типа Т. В этом интерфейсе определяется метод Equals () , как показано ниже.
bool Equals(Т other)
В этом методе сравниваются вызывающий объект и другой объект, определяемый параметром other. В итоге возвращается логическое значение true, если оба объекта равны, а иначе — логическое значение false.
В ходе реализации интерфейса IEquatable<T> обычно требуется также переопределять методы GetHashCode () и Equals (Object), определенные в классе Object, чтобы они оказались совместимыми с конкретной реализацией метода Equals (). Ниже приведен пример программы, в которой демонстрируется исправленный вариант упоминавшегося ранее метода Is In ().
// Требуется обобщенный интерфейс IEquatable<T>.
public static bool IsIn<T>(T what, T[] obs) where T : IEquatable<T> { foreach(T v in obs)
if(v.Equals(what)) // Применяется метод Equals(). return true;
Return false;
}
Обратите внимание в приведенном выше примере на применение следующега ограничения.
where Т : IEquatable<T>
Это ограничение гарантирует, что только те типы, в которых реализован интерфейс IEquatable, являются действительными аргументами типа для метода Is In () . Внутри этого метода применяется метод Equals () , который определяет равенство одного объекта другому.
Для определения относительного порядка следования двух элементов применяется интерфейс I Comp а г able. У этого интерфейса имеются две формы: обобщенная и необобщенная. Обобщенная форма данного интерфейса обладает преимуществом обеспечения типовой безопасности, и поэтому мы рассмотрим здесь именно ее. Обобщенный интерфейс IComparable<T> объявляется следующим образом.
public interface IComparable<T>
Сравниваемый тип данных передается ему в качестве аргумента типа Т. В этом интерфейсе определяется метод CompareTo () , как показано ниже.
int CompareTo(Т other)
В этом методе сравниваются вызывающий объект и другой объект, определяемый параметром other. В итоге возвращается нуль, если вызывающий объект оказывается больше, чем объект other ; и отрицательное значение, если вызывающий объект оказывается меньше, чем объект other.
Для того чтобы воспользоваться методом CompareTo () , необходимо указать ограничение, которое требуется наложить на аргумент типа для реализации обобщенного интерфейса IComparable<T>. А затем достаточно вызвать метод CompareTo (), чтобы сравнить два экземпляра параметра типа.
Ниже приведен пример применения обобщенного интерфейса IComparable<T>. В этом примере вызывается метод InRange () , возвращающий логическое значение true, если объект оказывается среди элементов отсортированного массива.
// Требуется обобщенный интерфейс IComparable<T>. В данном методе // предполагается, что массив отсортирован. Он возвращает логическое // значение true, если значение параметра what оказывается среди элементов // массива, передаваемых параметру obs.
public static bool InRange<T>(T what, T[] obs) where T : IComparable<T> { if(what.CompareTo(obs[0]) < 0 ||
what.CompareTo(obs[obs.Length-1]) > 0) return false; return true;
}
В приведенном ниже примере программы демонстрируется применение обоих методов Is In () и InRange () на практике.
// Продемонстрировать применение обобщенных // интерфейсов IComparable<T> и IEquatable<T>.
Using System;
// Теперь в классе MyClass реализуются обобщенные // интерфейсы IComparable<T> и IEquatable<T>. class MyClass : IComparable<MyClass>, IEquatable<MyClass> { public int Val;
public MyClass(int x) { Val = x; }
// Реализовать обобщенный интерфейс IComparable<T>. public int CompareTo(MyClass other) {
return Val - other.Val; // Now, no cast is needed.
> \
// Реализовать обобщенный интерфейс IEquatable<T>.
public bool Equals(MyClass other) { return Val == other.Val;
}
// Переопределить метод Equals(Object).
public override bool Equals(Object obj) { if(obj is MyClass)