Return Equals((MyClass) obj); return false;
}
// Переопределить метод GetHashCode().
public override int GetHashCode() { return Val.GetHashCode() ;
}
}
class CompareDemo {
// Требуется обобщенный интерфейс 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;
}
// Требуется обобщенный интерфейс 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(ob§[obs.Length-1]) > 0) return false; return true;
}
// Продемонстрировать операции сравнения, static void Main() {
// Применить метод Isln() к данным типа int. int[] nums = { 1, 2, 3, 4, 5 };
If(IsIn(2, nums))
Console.WriteLine("Найдено значение 2.");
If(Isln(99, nums))
Console.WriteLine("He подлежит выводу.");
// Применить метод Isln() к объектам класса MyClass.
MyClass[] mcs = { new MyClass(1), new MyClass(2),
new MyClass(3), new MyClass(4) };
If(lsln(new MyClass(3), mcs))
Console.WriteLine("Найден объект MyClass(3).");
If(Isln(new MyClass(99), mcs))
Console.WriteLine("He подлежит выводу.");
// Применить метод InRange() к данным типа int. if(InRange(2, nums))
Console.WriteLine("Значение 2 находится в границах массива nums."); if(InRange(1, nums))
Console.WriteLine("Значение 1 находится в границах массива nums."); if(InRange(5, nums))
Console.WriteLine("Значение 5 находится в границах массива nums."); if(!InRange(0, nums))
Console.WriteLine("Значение О HE находится в границах массива nums."); if(!InRange(6, nums))
Console.WriteLine("Значение 6 HE находится в границах массива nums.");
// Применить метод InRange() к объектам класса MyClass.. if(InRange(new MyClass(2), mcs))
Console.WriteLine("Объект MyClass(2) находится в границах массива nums."); if(InRange(new MyClass(1), mcs))
Console.WriteLine("Объект MyClass(1) находится " +
"в границах массива nums."); if(InRange(new MyClass(4), mcs))
Console.WriteLine("Объект MyClass(4) находится " +
"в границах массива nums."); if(!InRange(new MyClass(0), mcs))
Console.WriteLine("Объект MyClass(0) HE " +
"находится в границах массива nums."); if(!InRange(new MyClass(5), mcs))
Console.WriteLine("Объект MyClass(5) HE " +
"находится в границах массива nums.");
}
}
Выполнение этой программы приводит к следующему результату.
Найдено значение 2.
Найден объект MyClass (3) .
Значение 2 находится в границах массива nums.
Значение 1 находится в границах массива nums.
Значение 5 находится в границах массива nums.
Значение 0 НЕ находится в границах массива nums
Значение 6 НЕ находится в границах массива nums
Объект MyClass(2) находится в границах массива nums.
Объект MyClass(1) находится в границах массива nums.
Объект MyClass(4) находится в границах массива nums.
Объект MyClass(0) НЕ находится в границах массива nums.
Объект MyClass(5) НЕ находится в границах массива nums.
ПРИМЕЧАНИЕ
Если параметр типа обозначает ссылку или ограничение на базовый класс, то к экземплярам объектов, определяемых таким параметром типа, можно применять операторы == и ! =, хотя они проверяют на равенство только ссылки. А для сравнения значений придется реализовать интерфейс IComparable или же обобщенные интерфейсы IComparable<T> и IEquatable<T>.
Иерархии обобщенных классов
Обобщенные классы могут входить в иерархию классов аналогично необобщенным классам. Следовательно, обобщенный класс может действовать как базовый или производный класс. Главное отличие между иерархиями обобщенных и необобщенных классов заключается в том, что в первом случае аргументы типа, необходимые обобщенному базовому классу, должны передаваться всеми производными классами вверх по иерархии аналогично передаче аргументов конструктора.
Применение обобщенного базового класса