Справочник по Ada 2005
12.2 Тела обобщённых единиц
Тело обобщённой единицы (обобщённое тело) является шаблоном для тел экземпляров. Синтаксис обобщённого тела идентичен синтаксису тела необобщённой единицы.
Динамическая семантика
Выполнение обобщённого тела не имеет иного эффекта, кроме установления возможности дальнейшей инстанциации обобщённой единицы без сбоя проверки Этапа выполнения. Если обобщённое тело является потомком обобщённого пакета, то его выполнение устанавливает, что каждая соответствующая декларация, вложенная в экземпляр родителя (см. 10.1.1), может отныне быть инстанцирована без сбоя проверки Этапа выполнения.
ПРИМЕЧАНИЯ
4 Синтаксис обобщённых подпрограмм подразумевает, что тело обобщённой подпрограммы всегда является завершением декларации.
Примеры
Пример тела обобщённой процедуры:
procedure Exchange(U, V : in out Elem) is -- см. 12.1
T : Elem; -- обобщённый формальный тип
begin
T := U;
U := V;
V := T;
end Exchange;
T : Elem; -- обобщённый формальный тип
begin
T := U;
U := V;
V := T;
end Exchange;
Пример тела обобщённой функции:
function Squaring(X : Item) return Item is -- см. 12.1
begin
return X*X; -- формальный оператор "*"
end Squaring;
begin
return X*X; -- формальный оператор "*"
end Squaring;
Пример тела обобщённого пакета:
package body On_Vectors is -- см. 12.1
function Sum(A, B : Vector) return Vector is
Result : Vector(A'Range); -- формальный тип Vector
Bias : constant Integer := B'First - A'First;
begin
if A'Length /= B'Length then
raise Length_Error;
end if;
Result : Vector(A'Range); -- формальный тип Vector
Bias : constant Integer := B'First - A'First;
begin
if A'Length /= B'Length then
raise Length_Error;
end if;
for N in A'Range loop
Result(N) := Sum(A(N), B(N + Bias)); -- формальная функция Sum
end loop;
return Result;
end Sum;
Result(N) := Sum(A(N), B(N + Bias)); -- формальная функция Sum
end loop;
return Result;
end Sum;
function Sigma(A : Vector) return Item is
Total : Item := A(A'First); -- формальный тип Item
begin
for N in A'First + 1 .. A'Last loop
Total := Sum(Total, A(N)); -- формальная функция Sum
end loop;
return Total;
end Sigma;
end On_Vectors;
Total : Item := A(A'First); -- формальный тип Item
begin
for N in A'First + 1 .. A'Last loop
Total := Sum(Total, A(N)); -- формальная функция Sum
end loop;
return Total;
end Sigma;
end On_Vectors;