В объявлении класса Gen
можно указывать любое имя параметра типа, но по традиции выбирается имя Т. К числу TValue
или ТКеу
. Но в этом случае первой в имени параметра типа принято указывать прописную букву Т.
Далее имя Т используется для объявления переменной ob, как показано в следующей строке кода.
Т ob; // объявить переменную типа Т
Как пояснялось выше, имя параметра типа Т служит меткой-заполнителем конкретного типа, указываемого при создании объекта класса Gen
. Поэтому переменная ob будет иметь тип,
А теперь рассмотрим конструктор класса Gen
.
public Gen(T о) {
ob = о;
}
Как видите, параметр о
этого конструктора относится к типу Т. Это означает, что конкретный тип параметра о определяется типом, привязываемым к Т при создании объекта класса Gen. А поскольку параметр о и переменная экземпляра ob относятся к типу Т, то после создания объекта класса Gen
их конкретный тип окажется одним и тем же.
С помощью параметра типа Т можно также указывать тип, возвращаемый методом, как показано ниже на примере метода GetOb()
.
public Т GetOb() {
return ob;
}
Переменная ob также относится к типу Т, поэтому ее тип совпадает с типом, возвращаемым методом GetOb()
.
Метод ShowType()
отображает тип параметра Т, передавая его оператору typeof
. Но поскольку реальный тип подставляется вместо Т при создании объекта класса Gen
, то оператор typeof
получит необходимую информацию о конкретном типе.
В классе GenericsDemo
демонстрируется применение обобщенного класса Gen
. Сначала в нем создается вариант класса Gen
для типа int
.
Gen
Внимательно проанализируем это объявление. Прежде всего обратите внимание на то, что тип int
указывается в угловых скобках после имени класса Gen
. В этом случае int
служит Gen
, в котором тип Т заменяется типом int везде, где он встречается. Следовательно, после этого объявления int
становится типом переменной ob и возвращаемым типом метода GetOb()
.
В следующей строке кода переменной iOb присваивается ссылка на экземпляр объекта класса Gen
для варианта типа int
.
iOb = new Gen
Обратите внимание на то, что при вызове конструктора класса Gen
указывается также аргумент типа int
. Это необходимо потому, что переменная (в данном случае — iOb), которой присваивается ссылка, относится к типу Gen
. Поэтому ссылка, возвращаемая оператором new
, также должна относиться к типу Gen
. В противном случае во время компиляции возникнет ошибка. Например, приведенное ниже присваивание станет причиной ошибки во время компиляции.
iOb = new Gen
Переменная iOb относится к типу Gen
Затем в программе отображается тип переменной ob в объекте iOb — тип System.Int32
. Это структура .NET, соответствующая типу int. Далее значение переменной ob получается в следующей строке кода.
int v = iOb.GetOb();
Возвращаемым для метода GetOb()
является тип Т, который был заменен на тип int при объявлении переменной iOb, и поэтому метод GetOb()
возвращает значение того же типа int
. Следовательно, данное значение может быть присвоено переменной v типа int
.
Далее в классе GenericsDemo
объявляется объект типа Gen
.
Gen
В этом объявлении указывается аргумент типа string
, поэтому в объекте класса Gen вместо Т подставляется тип string
. В итоге создается вариант класса Gen
для типа string
, как демонстрируют остальные строки кода рассматриваемой здесь программы.