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

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

Расширяющий_агрегат задаёт значение для типа, являющегося расширением записи, указывая значение или подтип предка типа, а затем — ассоциации для любых компонентов, не определённых частью предшествующей_части.

Синтаксис

расширяющий_агрегат ::=
(предшествующая_часть with список_ассоциаций_компонентов_записи)
предшествующая_часть ::= выражение | метка_подтипа

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

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

Правила легальности

Если предшествующая_часть является метка_подтипа, она должна обозначать конкретный помеченный подтип. Если предшествующая_часть является выражением, она не должна иметь динамический значок. Тип расширяющего_агрегата должен быть потомком типа предшествующей_части (тип_предка), через одно или несколько расширений записи (и без расширений с приватными компонентами). Если предшествующая_часть является метка_подтипа, вид типа предка, от которого происходит тип (см. 7.3.1), не должен иметь неизвестных дискриминантов.
Если тип предшествующей_части ограничен, и по крайней мере один компонент необходим в список_ассоциаций_компонентов_записи, то предшествующая_часть не должна иметь действующего составляющего выражения (см. 4.4), являющегося вызовом функции с неограниченным подтипом результата.

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

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

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

Для оценки расширяющего_агрегата вычисляется список_ассоциаций_компонентов_записи. Если предшествующая_часть является выражением, вычисляется и оно; если предшествующая_часть является метка_подтипа, компоненты значения агрегата, не заданные список_ассоциаций_компонентов_записи, инициализируются по умолчанию, как для объекта типа предка. Любые неявные инициализации или оценки выполняются в произвольном порядке, за исключением того, что выражение для дискриминанта оценивается до любой другой оценки или инициализации, зависящей от него.
Если тип предшествующей_части имеет дискриминанты, и предшествующая_часть не является метка_подтипа, обозначающей неограниченный подтип, то проверяется, что каждый дискриминант, определённый предшествующей_частью, имеет значение, указанное для соответствующего дискриминанта, если таковой имеется, либо в список_ассоциаций_компонентов_записи, либо в определении_типа_производного для какого-либо предка типа расширяющего_агрегата. Если проверка не пройдена, генерируется Constraint_Error.
ПРИМЕЧАНИЕ 1 Согласно правилам, указанным в 4.3.1, если все компоненты значения расширяющего_агрегата определены предшествующей_частью, то список_ассоциаций_компонентов_записи будет просто пустой_записью.
ПРИМЕЧАНИЕ 2 Если предшествующая_часть является метка_подтипа, то его тип может быть абстрактным. Если его тип управляется, то в качестве последнего шага оценки агрегата вызывается процедура Initialize предка типа, если процедура Initialize не является абстрактной (см. 7.6).

Примеры

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


Spec-Zone.ru

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