Spec-Zone.ru › Ada 2022
Справочник по Ada (Ada 2022)

12.5 Формальные типы

Формальный подтип в качестве параметра может быть использован для передачи в генерическую единицу подтипа, тип которого принадлежит определённой категории типов.

Синтаксис

formal_type_declaration ::=
formal_complete_type_declaration
| formal_incomplete_type_declaration
formal_complete_type_declaration ::=
type defining_identifier[discriminant_part] is formal_type_definition
[or use default_subtype_mark] [aspect_specification];
formal_incomplete_type_declaration ::=
type defining_identifier[discriminant_part] [is tagged]
[or use default_subtype_mark];
formal_type_definition ::=
formal_private_type_definition
| formal_derived_type_definition
| formal_discrete_type_definition
| formal_signed_integer_type_definition
| formal_modular_type_definition
| formal_floating_point_definition
| formal_ordinary_fixed_point_definition
| formal_decimal_fixed_point_definition
| formal_array_type_definition
| formal_access_type_definition
| formal_interface_type_definition

Правила допустимости

Для формального подтипа в качестве фактического значения должен быть указан subtype_mark; он обозначает (генерический) фактический подтип.

Статическая семантика

formal_type_declaration объявляет (генерический) формальный тип и его первый подтип, (генерический) формальный подтип.
Форма formal_type_definition определяет категорию (типов), к которой принадлежит формальный тип. Для formal_private_type_definition ключевые слова tagged и limited указывают категорию типов (см. 12.5.1). Ключевое слово tagged также выполняет эту роль в случае formal_incomplete_type_declaration. Для formal_derived_type_definition категорией типов является класс производных, укоренённый в типе предка. Для других формальных типов название синтаксической категории указывает категорию типов; formal_discrete_type_definition определяет дискретный тип и так далее.

Правила допустимости

Фактический тип должен принадлежать категории, определённой для формального типа.
default_subtype_mark, если он есть, должен обозначать подтип, который разрешён как фактический подтип для формального типа.

Статическая семантика

Формальный тип также принадлежит каждой категории, содержащей определённую категорию. Вспомогательные подпрограммы типа соответствуют любым типам в определённой категории. Для формального типа, отличного от формального производного типа, это предопределённые операторы типа. Для элементарного формального типа предопределённые операторы неявно объявляются сразу после объявления формального типа. Для составного формального типа предопределённые операторы неявно объявляются либо сразу после объявления формального типа, либо позже в области объявления, в которой тип объявлен в соответствии с правилами 7.3.1. В экземпляре копия такого неявного объявления объявляет представление предопределённого оператора фактического типа, даже если этот оператор переопределён для фактического типа и даже если он никогда не объявлялся для фактического типа, если фактический тип не является необъектным типом записи, в этом случае он объявляет представление примитивного (равенства) оператора. Правила, специфичные для формальных производных типов, приведены в 12.5.1.
ПРИМЕЧАНИЕ 1 Формальные типы, как и все типы, не имеют имён. Вместо этого имя может обозначать формальный подтип. Внутри генерической единицы формальный тип считается отличным от всех других (формальных или неформальных) типов.
ПРИМЕЧАНИЕ 2 discriminant_part разрешён только для определённых видов типов и, следовательно, для определённых видов формальных типов. См. 3.7.

Примеры

Примеры формальных типов:
type Item is private;
type Buffer(Length : Natural) is limited private;
type Enum is (<>);
type Int is range <>;
type Angle is delta <>;
type Mass is digits <>;
type Table is array (Enum) of Item;
Пример формальной части, объявляющей формальный целочисленный тип:
generic
type Rank is range <>;
First : Rank := Rank'First;
Second : Rank := First + 1; -- оператор "+" типа Rank


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API