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

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

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

Синтаксис

record_extension_part ::= with record_definition

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

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

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

Расширение записи является нулевым расширением, если в его объявлении нет known_discriminant_part и его record_extension_part не включает объявления компонентов.
В случае, когда (временной) вид объекта X представляет собой помеченный тип T1 или T1'Class, а (временной) тег X — T2'Tag, только компоненты (если таковые имеются) X, которые являются компонентами T1 (или которые являются дискриминантами, соответствующими дискриминанту T1), называются компонентами номинального типа X. Аналогично, только части (соответственно, подкомпоненты) T1 являются частями (соответственно, подкомпонентами) номинального типа X.

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

Развертывание record_extension_part состоит из развертывания record_definition.
ПРИМЕЧАНИЕ 1 Термин «расширение типа» относится к типу в целом. Термин «часть расширения» относится к фрагменту текста, который определяет дополнительные компоненты (если таковые имеются), которые имеет расширение типа относительно указанного типа предка.
ПРИМЕЧАНИЕ 2 Когда расширение объявляется непосредственно в теле, примитивные подпрограммы наследуются и могут быть переопределены, но новые примитивные подпрограммы добавить нельзя.
ПРИМЕЧАНИЕ 3 Согласно правилам, приведенным в 3.8, имя, которое обозначает компонент (включая дискриминант) типа родителя, является недопустимым в record_extension_part. Аналогично, имя, обозначающее компонент, определенный в record_extension_part, является недопустимым в record_extension_part. Имя, обозначающее дискриминант расширения записи, допустимо, при условии, что оно ссылается на дискриминант, определенный в новом known_discriminant_part в окружающем объявлении типа.
ПРИМЕЧАНИЕ 4 Согласно правилам, приведенным в 8.3, каждый видимый компонент расширения записи будет иметь уникальное имя, независимо от того, унаследован ли компонент (видимо) от типа родителя или объявлен в record_extension_part.

Примеры

Примеры расширений записей (типов, определенных выше в 3.9):
тип Painted_Point является новым Point с
записью
Paint : Color := White;
конец записи;
-- Компоненты X и Y унаследованы
Origin : константа Painted_Point := (X | Y => 0.0, Paint => Black);
тип Literal является новым Expression с
записью -- лист в дереве выражений
Value : Real;
конец записи;
тип Expr_Ptr является доступом ко всем Expression'Class;
-- см. 3.9
тип Binary_Operation является новым Expression с
записью -- внутренний узел в дереве выражений
Left, Right : Expr_Ptr;
конец записи;
тип Addition является новым Binary_Operation с нулевой записью;
тип Subtraction является новым Binary_Operation с нулевой записью;
-- Для этих расширений дополнительных компонентов не требуется
Tree : 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