Сравниваемый тип данных передается ему в качестве аргумента типаТ.В этом интерфейсе определяется методCompareTo (), как показано ниже.

int CompareTo(Тother)

В этом методе сравниваются вызывающий объект и другой объект, определяемый параметромother.В итоге возвращается нуль, если вызывающий объект оказывается больше, чем объектother; и отрицательное значение, если вызывающий объект оказывается меньше, чем объектother.

Для того чтобы воспользоваться методомCompareTo (), необходимо указать ограничение, которое требуется наложить на аргумент типа для реализации обобщенного интерфейсаIComparable.А затем достаточно вызвать методCompareTo(), чтобы сравнить два экземпляра параметра типа.

Ниже приведен пример применения обобщенного интерфейсаIComparable.В этом примере вызывается методInRange (), возвращающий логическое значениеtrue,если объект оказывается среди элементов отсортированного массива.

// Требуется обобщенный интерфейс IComparable. В данном методе // предполагается, что массив отсортирован. Он возвращает логическое // значение true, если значение параметра what оказывается среди элементов // массива, передаваемых параметру obs.

public static bool InRange(T what, T[] obs) where T : IComparable { if(what.CompareTo(obs[0]) < 0 ||

what.CompareTo(obs[obs.Length-1]) > 0) return false; return true;

}

В приведенном ниже примере программы демонстрируется применение обоих методовIs In() иInRange() на практике.

// Продемонстрировать применение обобщенных // интерфейсов IComparable и IEquatable.

using System;

// Теперь в классе MyClass реализуются обобщенные // интерфейсы IComparable и IEquatable. class MyClass : IComparable, IEquatable { public int Val;

public MyClass(int x) { Val = x; }

// Реализовать обобщенный интерфейс IComparable. public int CompareTo(MyClass other) {

return Val - other.Val; // Now, no cast is needed.

> \

// Реализовать обобщенный интерфейс IEquatable.

public bool Equals(MyClass other) { return Val == other.Val;

}

// Переопределить метод Equals(Object).

public override bool Equals(Object obj) { if(obj is MyClass)

return Equals((MyClass) obj); return false;

}

// Переопределить метод GetHashCode().

public override int GetHashCode() { return Val.GetHashCode() ;

}

}

class CompareDemo {

// Требуется обобщенный интерфейс IEquatable.

public static bool IsIn(T what, T[] obs) where T : IEquatable { foreach(T v in obs)

if(v.Equals(what)) // Применяется метод Equals() return true;

return false;

}

Перейти на страницу:

Похожие книги