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

3.9.1 Расширения типов

Каждый тип-расширение является помеченным типом и является расширением записи или частным расширением некоторого другого помеченного типа или неинтерфейсным синхронизированным помеченным типом.

Синтаксис

record_extension_part ::= with record_definition

Правила законности

Тип-родитель расширения записи не должен быть типом-классом, а также не должен быть синхронизированным помеченным типом (см. 3.9.4). Если тип-родитель или любой его предок не является ограниченным, то каждый из компонентов record_extension_part должен быть неограниченным. В дополнение к местам, где обычно применяются правила законности (см. 12.3), эти правила также применяются в частной части экземпляра генерируемого блока.
В теле генерируемого блока или теле любого из его дочерних блоков библиотеки тип с меткой не должен быть объявлен как потомок формального типа, объявленного в формальной части генерируемого блока.

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

Расширение записи является нулевым расширением, если его объявление не содержит known_discriminant_part, а его record_extension_part не включает никаких component_declarationов.

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

Выполнение record_extension_part состоит из выполнения record_definition.
ПРИМЕЧАНИЯ
74 Термин «тип-расширение» относится к типу в целом. Термин «часть расширения» относится к фрагменту текста, который определяет дополнительные компоненты (если таковые имеются) расширения типа относительно указанного типа предка.
75 Когда расширение объявляется непосредственно в теле, примитивные подпрограммы наследуются и могут быть переопределены, но новые примитивные подпрограммы добавить нельзя.
76 Имя, обозначающее компонент (включая дискриминант) типа-родителя, не допускается в record_extension_part. Аналогично, имя, обозначающее компонент, определенный в record_extension_part, не допускается в record_extension_part. Допускается использование имени, обозначающего дискриминант расширения записи, при условии наличия нового known_discriminant_part в объявляемом типе. (Полное правило приведено в 3.8.)
77 Каждый видимый компонент расширения записи должен иметь уникальное имя, независимо от того, унаследован ли компонент (видимо) от родительского типа или объявлен в record_extension_part (см. 8.3).

Примеры

Примеры расширений записи (типов, определенных выше в 3.9):
тип Painted_Point является новым Point с
записью
Paint : Цвет := Белый;
конец записи;
-- Компоненты X и Y унаследованы
Происхождение : постоянное Painted_Point := (X | Y => 0.0, Paint => Черный);
тип Literal является новым Expression с
записью -- лист в дереве Expression
Value : Вещественное;
конец записи;
тип Expr_Ptr является доступом ко всем Expression'Class;
-- см. 3.10
тип Binary_Operation является новым Expression с
записью -- внутренний узел в дереве Expression
Left, Right : Expr_Ptr;
конец записи;
тип Addition является новым Binary_Operation с нулевой записью;
тип Subtraction является новым Binary_Operation с нулевой записью;
-- Для этих расширений дополнительные компоненты не требуются
Дерево : Expr_Ptr := -- Представление дерева «5.0 + (13.0–7.0)»
новый Addition'(
Left => новый Literal'(Value => 5.0),
Right => новый Subtraction'(
Left => новый Literal'(Value => 13.0),
Right => новый Literal'(Value => 7.0)));


Spec-Zone.ru

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