Начнем рассмотрение обобщений с простого примера обобщенного класса. В при веденной ниже программе определяются два класса. Первым из них является обобщен ный класс Gen, вторым — класс GenericsDemo, в котором используется класс Gen. // Простой пример обобщенного класса. using System; // В приведенном ниже классе Gen параметр типа Т заменяется // реальным типом данных при создании объекта типа Gen. class Gen { Т ob; // объявить переменную типа Т // Обратите внимание на то, что у этого конструктора имеется параметр типа Т. public Gen(T о) { ob = о; } // Возвратить переменную экземпляра ob, которая относится к типу Т. public Т GetOb { return ob; } // Показать тип Т. public void ShowType { Console.WriteLine("К типу T относится " + typeof(Т)); } } // Продемонстрировать применение обобщенного класса. class GenericsDemo { static void Main { // Создать переменную ссылки на объект Gen типа int. Gen iOb; // Создать объект типа Gen и присвоить ссылку на него переменной iOb. iOb = new Gen(102); // Показать тип данных, хранящихся в переменной iOb. iOb.ShowType; // Получить значение переменной iOb. int v = iOb.GetOb; Console.WriteLine("Значение: " + v); Console.WriteLine; // Создать объект типа Gen для строк. Gen strOb = new Gen("Обобщения повышают эффективность."); // Показать тип данных, хранящихся в переменной strOb. strOb.ShowType; // Получить значение переменной strOb. string str = strOb.GetOb; Console.WriteLine("Значение: " + str); } }

Эта программа дает следующий результат. К типу Т относится System.Int32 Значение: 102 К типу Т относится System.String Значение: Обобщения повышают эффективность.

Внимательно проанализируем эту программу. Прежде всего обратите внимание на объявление класса Gen в приведенной ниже строке кода: class Gen {

где Т — это имя параметра типа. Это имя служит в качестве метки-заполнителя кон кретного типа, который указывается при создании объекта класса Gen. Следовательно, имя Т используется в классе Gen всякий раз, когда требуется параметр типа. Обратите внимание на то, что имя Т заключается в угловые скобки (< >). Этот синтаксис мож но обобщить: всякий раз, когда объявляется параметр типа, он указывается в угловых скобках. А поскольку параметр типа используется в классе Gen, то такой класс счита ется обобщенным.

В объявлении класса Gen можно указывать любое имя параметра типа, но по тра диции выбирается имя Т. К числу других наиболее употребительных имен параметров типа относятся V и Е. Вы, конечно, вольны использовать и более описательные имена, например TValue или ТКеу. Но в этом случае первой в имени параметра типа при нято указывать прописную букву Т.

Далее имя Т используется для объявления переменной ob, как показано в следую щей строке кода. Т ob; // объявить переменную типа Т

Как пояснялось выше, имя параметра типа Т служит меткой-заполнителем кон кретного типа, указываемого при создании объекта класса Gen. Поэтому переменная ob будет иметь тип, привязываемый к Т при получении экземпляра объекта класса Gen. Так, если вместо Т указывается тип string, то в экземпляре данного объекта перемен ная оb будет иметь тип string.

А теперь рассмотрим конструктор класса Gen. public Gen(Т о) { ob = о; }

Как видите, параметр о этого конструктора относится к типу Т. Это означает, что конкретный тип параметра о определяется типом, привязываемым к Т при создании объекта класса Gen. А поскольку параметр о и переменная экземпляра ob относятся к типу Т, то после создания объекта класса Gen их конкретный тип окажется одним и тем же.

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

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