Справочник Ada 2012
12.1 Общие объявления
Определение generic_declaration объявляет общее устройство, которое может быть либо общим подпрограммой, либо общим пакетом. Определение generic_declaration включает generic_formal_part, объявляющий любые общие формальные параметры. Общий формальный параметр может быть объектом; в качестве альтернативы (в отличие от параметра подпрограммы), он может быть типом, подпрограммой или пакетом.
Синтаксис
generic_subprogram_declaration ::=
generic_formal_part subprogram_specification
[aspect_specification];
generic_formal_part subprogram_specification
[aspect_specification];
generic_formal_parameter_declaration ::=
formal_object_declaration
| formal_type_declaration
| formal_subprogram_declaration
| formal_package_declaration
formal_object_declaration
| formal_type_declaration
| formal_subprogram_declaration
| formal_package_declaration
Единственной формой subtype_indication, разрешенной в generic_formal_part, является subtype_mark (то есть, subtype_indication не должна включать явного constraint). Имя объявления общей подпрограммы должно быть идентификатором (не символом оператора).
Статические семантика
Определение generic_declaration объявляет общее устройство — общий пакет, общую процедуру или общую функцию, как это подходит.
Сущность является общим формальным элементом, если она объявлена в generic_formal_parameter_declaration. «Общий формальный» или просто «формальный» используется как префикс при упоминании объектов, подтипов (и типов), функций, процедур и пакетов, которые являются общими формальными сущностями, а также их соответствующих объявлений. Примеры: «общая формальная процедура» или «объявление формального целочисленного типа».
Динамическая семантика
Выполнение generic_declaration не оказывает влияния.
ПРИМЕЧАНИЯ
1 Вне общего устройства имя, обозначающее generic_declaration, обозначает общее устройство. В отличие от этого, в области объявления общего устройства имя, обозначающее generic_declaration, обозначает текущий экземпляр.
2 В теле общей subprogram_body имя этого блока программ действует как имя подпрограммы. Следовательно, это имя может быть перегружено, и оно может появиться в рекурсивном вызове текущего экземпляра. По той же причине это имя не может появиться после служебного слова new в (рекурсивном) generic_instantiation.
3 default_expression или default_name, появляющиеся в generic_formal_part, не вычисляются во время выполнения generic_formal_part; вместо этого они вычисляются при использовании. (Обычные правила видимости применяются к любому имени, используемому в выражении: обозначенное объявление, следовательно, должно быть видно в месте выражения.)
Примеры
Примеры общих формальных частей:
generic -- без параметров
generic
Size : Natural; -- формальный объект
Size : Natural; -- формальный объект
generic
Length : Integer := 200; -- формальный объект со значением по умолчанию
Length : Integer := 200; -- формальный объект со значением по умолчанию
Area : Integer := Length*Length; -- формальный объект со значением по умолчанию
generic
type Item is private; -- формальный тип
type Index is (<>); -- формальный тип
type Row is array(Index range <>) of Item; -- формальный тип
with function "<"(X, Y : Item) return Boolean; -- формальный подпрограмма
type Item is private; -- формальный тип
type Index is (<>); -- формальный тип
type Row is array(Index range <>) of Item; -- формальный тип
with function "<"(X, Y : Item) return Boolean; -- формальный подпрограмма
Примеры объявлений общих подпрограмм Exchange и Squaring:
generic
type Elem is private;
procedure Exchange(U, V : in out Elem);
type Elem is private;
procedure Exchange(U, V : in out Elem);
generic
type Item is private;
with function "*"(U, V : Item) return Item is <>;
function Squaring(X : Item) return Item;
type Item is private;
with function "*"(U, V : Item) return Item is <>;
function Squaring(X : Item) return Item;
Пример объявления общего пакета:
generic
type Item is private;
type Vector is array (Positive range <>) of Item;
with function Sum(X, Y : Item) return Item;
package On_Vectors is
function Sum (A, B : Vector) return Vector;
function Sigma(A : Vector) return Item;
Length_Error : exception;
end On_Vectors;
type Item is private;
type Vector is array (Positive range <>) of Item;
with function Sum(X, Y : Item) return Item;
package On_Vectors is
function Sum (A, B : Vector) return Vector;
function Sigma(A : Vector) return Item;
Length_Error : exception;
end On_Vectors;