Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шаблоны_Generic.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
94 Кб
Скачать
☆

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

9