Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Обобщенные подпрограммы: обзор

Поиск

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

Обобщенным типом (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.

Обобщенной подпрограммой (generic) называется шаблон для создания подпрограммы, параметризованный одним или несколькими типами. Подпрограмма образуется из шаблона подпрограммы подстановкой конкретных типов в качестве параметров. Параметры указываются после имени подпрограммы в угловых скобках.

Например, следующая generic-функция параметризована одним параметром:

function FindFirstInArray<T>(a: array of T; val: T): integer;
begin
Result := -1;
for var i:=0 to a.Length-1 do
if a[i]=val then
begin
Result := i;
exit;
end;
end;

var x: array of string;

begin
SetLength(x,4);
x[0] := 'Ваня';
x[1] := 'Коля';
x[2] := 'Сережа';
x[3] := 'Саша';
writeln(FindFirstInArray(x,'Сережа'));
end.

При вызове обобщенной подпрограммы тип-параметр шаблона можно не указывать, поскольку компилятор выводит типы параметров шаблона по типам фактических параметров. В данном случае после выведения получено: T=string.

При выведении требуется точное соответствие типов, приведение типов не допускается. Например, при компиляции следующего кода

...
var
x: array of real;

begin
SetLength(x,3);
x[0] := 1;
x[1] := 2.71;
x[2] := 3.14;
writeln(FindFirstInArray(x,1));
end.

произойдет ошибка. Причина состоит в том, что первый параметр имеет тип array of real, а второй - тип integer, что не соответствует ни одному типу T в заголовке обобщенной функции. Для решения проблемы следует либо изменить тип второго параметра на real:

FindFirstInArray(x,1.0)

либо явно после имени функции в угловых скобках указать имя типа, которым параметризован данный вызов:

FindFirstInArray&<real>(x,1)

Использование знака & здесь обязательно, поскольку в противном случае компилятор трактует знак < как "меньше".

Шаблонными могут быть не только обычные подпрограммы, но и методы классов, а также методы другого шаблона класса. Например:

type
Pair<T,Q> = class
first: T;
second: Q;
function ChangeSecond<S>(newval: S): Pair<T, S>;
end;

function Pair<T,Q>.ChangeSecond<S>(newval: S): Pair<T,S>;
begin
result := new Pair<T,S>;
result.first := first;
result.second := newval;
end;

var
x: Pair<integer,real>;
y: Pair<integer,string>;
begin

x := new Pair<integer,real>;
x.first := 3;
y := x.ChangeSecond('abc');
writeln(y.first, y.second);
end.

По окончании работы данная программа выведет 3abc.



Поделиться:


Последнее изменение этой страницы: 2024-06-27; просмотров: 2; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.220.196.68 (0.005 с.)