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

4.3.2 Расширяющие агрегаты

Расширяющий агрегат (extension_aggregate) задает значение для типа-расширения записи, указав значение или подтип предка типа, а затем — связи для любых компонентов, не определенных частью предка (ancestor_part).

Синтаксис

extension_aggregate ::=
(ancestor_part with список_связей_компонентов_записи)
ancestor_part ::= выражение | метка_подтипа

Правила разрешения имен

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

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

Если часть предка (ancestor_part) является меткой подтипа (subtype_mark), она должна обозначать конкретный помеченный подтип. Если часть предка (ancestor_part) является выражением, она не должна быть динамически помеченной. Тип расширяющего агрегата (extension_aggregate) должен быть получен из типа части предка (ancestor_part) через одно или несколько расширений записи (и без расширений с приватным доступом).

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

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

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

При вычислении расширяющего агрегата (extension_aggregate) вычисляется список связей компонентов записи (record_component_association_list). Если часть предка (ancestor_part) является выражением, оно также вычисляется; если часть предка (ancestor_part) является меткой подтипа, компоненты значения агрегата, не указанные в списке связей компонентов записи (record_component_association_list), инициализируются по умолчанию так же, как для объекта предкового типа. Любые неявные инициализации или вычисления выполняются в произвольном порядке, за исключением того, что выражение для дискриминанта вычисляется до любого другого вычисления или инициализации, зависящего от него.
Если тип части предка (ancestor_part) имеет дискриминанты, которые не унаследованы типом расширяющего агрегата (extension_aggregate), тогда, если часть предка (ancestor_part) не является меткой подтипа, обозначающей свободный подтип, проверяется, что каждый дискриминант предка имеет значение, указанное для соответствующего дискриминанта, либо в списке связей компонентов записи (record_component_association_list), либо в определении типа производного (derived_type_definition) для какого-либо предка типа расширяющего агрегата (extension_aggregate). В случае неудачи возбуждается исключение Constraint_Error.
ПРИМЕЧАНИЯ
8 Если все компоненты значения расширяющего агрегата (extension_aggregate) определяются частью предка (ancestor_part), то список связей компонентов записи (record_component_association_list) должен быть просто пустой записью.
9 Если часть предка (ancestor_part) является меткой подтипа (subtype_mark), то её тип может быть абстрактным. Если её тип управляемый, то в качестве последнего шага вычисления агрегата вызывается процедура Initialize предкового типа, если процедура Initialize не абстрактная (см. 7.6).

Примеры

Примеры расширяющих агрегатов (для типов, определённых в 3.9.1):
Painted_Point'(Point with Red)
(Point'(P) with Paint => Black)
(Expression with Left => 1.2, Right => 3.4)
Addition'(Binop with null record)
-- предполагая, что Binop имеет тип Binary_Operation


Spec-Zone.ru

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