PascalABC.NET

Обобщенные типы: обзор

Обобщенным типом (generic) называется шаблон для создания класса, записи или интерфейса, параметризованный одним или несколькими типами. Класс (запись, интерфейс) образуется из шаблона класса (записи, интерфейса) подстановкой конкретных типов в качестве параметров. Параметры указываются после имени обобщенного типа в угловых скобках. Например, Stack<T> - шаблон класса списка элементов типа T, параметризованный типом T, а Stack<integer> - класс списка с элементами типа integer.

Обобщённые подпрограммы описываются здесь.

Для объявления шаблона класса используется следующий синтаксис:

type   Node<T> = class
   
data: T;
    next: Node<T>;
  public
    constructor Create(d: T; nxt: Node<T>);
    begin
      data := d;
      next := nxt;
    end;
  end;
  Stack<T> = class
   
tp: Node<T>;
  public
    procedure
Push(x: T);
    begin
      tp := new Node<T>(x,tp);
    end;
    function Pop: T;
    begin
      Result := tp.data;
      tp := tp.next;
    end;
    function Top: T;
    begin
      Result := tp.data;
    end;
    function IsEmpty: boolean;
    begin
      Result := tp = nil;
    end;
  end;

Использование шаблона класса иллюстрируется ниже:

var
  si: Stack<integer>;
  sr: Stack<real>;
begin
  si := new Stack<integer>; 
  sr := new Stack<real>;
  for var i := 1 to 10 do
    si.Push(Random(100));
  while not si.IsEmpty do
    sr.Push(si.Pop);
  while not sr.IsEmpty do
    write(sr.Pop,' ');
end.

Подстановка конкретного типа-параметра в обобщенный тип называется инстанцированием.