Справочник по Ada 95
4.3.2 Агрегаты расширения
Агрегат extension_aggregate задаёт значение для типа-расширения записи, указав значение или подтип предка типа, за которым следуют ассоциации для любых компонентов, не определённых частью ancestor_part.
Синтаксис
extension_aggregate ::=
(ancestor_part с record_component_association_list)
(ancestor_part с record_component_association_list)
ancestor_part ::= выражение | метка_подтипа
Правила разрешения имён
Ожидаемый тип для extension_aggregate должен быть одним нелимитированным типом, являющимся расширением записи. Если ancestor_part является выражением, ожидается, что оно будет любого нелимитированного помеченного типа.
Правила допустимости
Если 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 должно быть просто null record.
9 Если ancestor_part является метка_подтипа, то его тип может быть абстрактным. Если его тип контролируется, то в последнем шаге оценки агрегата вызывается процедура Initialize типа предка, если процедура Initialize не абстрактная (см. 7.6).
Примеры
Примеры агрегатов расширения (для типов, определённых в 3.9.1):
Painted_Point'(Point с Red)
(Point'(P) с Paint => Black)
(Point'(P) с Paint => Black)
(Expression с Left => 1.2, Right => 3.4)
Addition'(Binop с null record)
-- предполагая, что Binop является типа Binary_Operation
Addition'(Binop с null record)
-- предполагая, что Binop является типа Binary_Operation