type имя_класса<параметр_обобщенного_типа [, ...]> = class //поля и методы end;
unit generics_unit;
interface
type TGenericClass<T>=class f T: T;
procedure SetT(Value:T) function GetT:T;
//объявление шаблона класса //поле обобщенного типа //метод записи в поле //метод чтения значения из поля
end;
implementation
function TGenericClass<T>.GetT: T; begin
Result:=fT; //узнаем содержимое поля end;
procedure TGenericClass<T>.SetT(Value: T); ,
begin
fT:=Value; //записываем данные в поле end;
end.
Для объявления параметра типа мы воспользовались символом т и заключили его в угловые скобки. Класс содержит единственное поле fT универсального типа т и два метода, позволяющих записывать и считывать значение из поля.
Разобравшись с объявлением и реализацией шаблона класса, способного работать с обобщенным типом данных, попробуем воспользоваться его услугами. Листинг 3.4 демонстрирует порядок обращения к экземпляру класса TGenericClass с указанием того, что он необходим нам в роли хранилища целого числа.
var gObject: TGenericClass<integer>;
i:integer; begin
gObj ect:=TGenericClass<integer>.Create;
gObject.SetT(99); //записываемзначение 99 i:=gObject.GetT; //считываем значение из класса
. gObject.Destroy;end;
Ключевой элемент листинга 3.4 — это его первая строка. В ней
указывается, какой тип данных должен будет задействован после создания
экземпляра класса
TGenericciass. Название типа записывается в угловых скобках после имени класса, в нашем случае это целое число integer. С таким же успехом мы можем создать объект любого типа, за небольшим исключением. В параметр типа не стоит передавать статистические массивы, строки старого образца (short string) и записи, содержащие разнотипные поля.