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)

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(obs[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 (IsIn(99, nums))

Console.WriteLine("He подлежит выводу.");

 

Применить метод Isln() к объектам класса MyClass.

MyClass[] mcs = { new MyClass(1), new MyClass(2),

new MyClass(3), new MyClass(4) };

 

If (IsIn(new MyClass(3), mcs))

Console.WriteLine("Найден объект MyClass(3).");

 

If (IsIn(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("Значение 0 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>.

-----------------------------------

 

 

Иерархии обобщенных классов

 

Обобщенные классы могут входить в иерархию классов аналогично необобщенным классам. Следовательно, обобщенный класс может действовать как базовый или производный класс. Главное отличие между иерархиями обобщенных и необобщенных классов заключается в том, что в первом случае аргументы типа, необходимые обобщенному базовому классу, должны передаваться всеми производными классами вверх по иерархии аналогично передаче аргументов конструктора.

 

 


Дата добавления: 2019-02-12; просмотров: 240; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!