C# 4.0 полное руководство - 2011
Шрифт:
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 к объектам
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>.
Иерархии обобщенных классов
Обобщенные классы могут входить в иерархию классов аналогично необобщенным классам. Следовательно, обобщенный класс может действовать как базовый или производный класс. Главное отличие между иерархиями обобщенных и необобщенных классов заключается в том, что в первом случае аргументы типа, необходимые обобщенному базовому классу, должны передаваться всеми производными классами вверх по иерархии аналогично передаче аргументов конструктора.
Применение обобщенного базового класса
Ниже приведен простой пример иерархии, в которой используется обобщенный базовый класс.
// Простая иерархия обобщенных классов, using System;
// Обобщенный базовый класс, class Gen<T> {
Т ob;
public Gen(Т о) { ob = о;
}
// Возвратить значение переменной ob. public Т GetOb { return ob;
}
}
// Класс, производный от класса Gen. class Gen2<T> : Gen<T> {
public Gen2(T o) : base(o) {
II ...
}
1
class GenHierDemo { static void Main {
Gen2<string> g2 = new Gen2<string>("Привет") ;
Console.WriteLine(g2.GetOb);
В этой иерархии класс Gen2 наследует от обобщенного класса Gen. Обратите внимание на объявление класса Gen2 в следующей строке кода.
class Gen2<T> : Gen<T> {
Параметр типа Т указывается в объявлении класса Gen2 и в то же время передается классу Gen. Это означает, что любой тип, передаваемый классу Gen2, будет передаваться также классу Gen. Например, в следующем объявлении:
Gen2<string> g2 = new Gen2<string>("Привет");
параметр типа string передается классу Gen. Поэтому переменная ob в той части класса Gen2, которая относится к классу Gen, будет иметь тип string.
Обратите также внимание на то, что в классе Gen2 параметр типа Т не используется, а только передается вверх по иерархии базовому классу Gen. Это означает, что в производном классе следует непременно указывать параметры типа, требующиеся его обобщенному базовому классу, даже если этот производный класс не обязательно должен быть обобщенным.
Разумеется, в производный класс можно свободно добавлять его собственные параметры типа, если в этом есть потребность. В качестве примера ниже приведен вариант предыдущей иерархии классов, где в класс Gen2 добавлен собственный параметр типа.
// Пример добавления собственных параметров типа в производный класс, using System;
// Обобщенный базовый класс, class Gen<T> {
Т ob; // объявить переменную типа Т