2. Родовые объекты
Если шаблон порождает класс, то это происходит во время компиляции. С точки зрения среды времени выполнения, тип, созданный на основе шаблона, это просто новый тип, который нельзя изменить при выполнении приложения.
Родовые объекты остаются таковыми и при выполнении приложения. Значит, в качестве параметров – типов можно использовать типы, неизвестные во время компиляции.
Типы-параметры
Родовые функции и типы объявляются с использованием ключевого слова generic (родовой), за которым в угловых скобках следуют список формальных параметров – типов с ключевым словом typename или class.
Типы-параметры, это идентификаторы, обозначающие параметр-тип.
Синтаксис
generic <typename Type>
void F(Type t, int i)
{
...// Тело функции
}
Более одного параметра допускается.
generic <typename Type, typename Type >
void F(Type t, array< Type > ^a, int len)
{
...// Тело функции
}
2.1. Родовые функции
generic <typename Type >
void GenericF(Type t)
{
Concole::WriteLine(t);
}
void main(void)
{
int i;
// Обращение с явным указанием типа
GenericF <int>(i); // Указывается имя фактического типа - int
// Обращение без указания типа, компилятор сам определит тип.
GenericF (200);
}
Параметр-тип должен появиться или в списке параметров, или как тип возвращаемого значения.
Параметром функции может быть массив.
generic <typename Type >
void GenericF(array < Type > ^My_Arr)
{
for each (Type t in My_Arr)
{
Concole::WriteLine (t);
}
}
void main(void)
{
array <String ^> ^ Arr_Str; // Массив указателей на строки.
Arr_Str=gcnew array <String ^> {”One”,”Two”,”Three”};
// Обращение
GenericF (Arr_Str); // Компилятор сам определит тип.
}
2.2. Родовые типы
Отличие от необщего объявления – в ключевом слове generic, за которым следует объявление параметров-типов.
Параметр-тип может использоваться в родовом определении везде, где должен использоваться тип – в как область, в сигнатуре метода как параметр или тип возвращаемого значения или как тип свойства.
generic <typename Type >
ref class R
{
Type t;
public :
R()
{
// Конструктор
}
property Type TValue
{
Type get()
{
return t;
}
void Set(Type tt)
{
t=tt;
}
}
};
//============================================================
void main(void)
{
double D=0.001;
int n=12 ;
// Тип Type - double
R <double> ^ R_double = gcnew R<double>() ;
// Тип Type - int
R <int> ^ R_int = gcnew R<int>() ;
R_double->Value = D ;
Concole::WriteLine (R_double->Value);
R_int->Value = n;
Concole::WriteLine (R_int->Value);
}
Пример. Generic_Class
