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

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

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

Синтаксис

record_extension_part ::= with record_definition

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

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

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

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

Примеры

Примеры расширений записи (типов, определенных выше в 3.9):
type Painted_Point is new Point with
record
Paint : Color := White;
end record;
-- Компоненты X и Y унаследованы
Origin : constant Painted_Point := (X | Y => 0.0, Paint => Black);
type Literal is new Expression with
record -- лист в дереве выражений
Value : Real;
end record;
type Expr_Ptr is access all Expression'Class;
-- см. 3.10
type Binary_Operation is new Expression with
record -- внутренний узел в дереве выражений
Left, Right : Expr_Ptr;
end record;
type Addition is new Binary_Operation with null record;
type Subtraction is new Binary_Operation with null record;
-- Для этих расширений дополнительных компонентов не требуется
Tree : Expr_Ptr := -- Деревовое представление «5.0 + (13.0-7.0)»
new Addition'(
Left => new Literal'(Value => 5.0),
Right => new Subtraction'(
Left => new Literal'(Value => 13.0),
Right => new Literal'(Value => 7.0)));


Spec-Zone.ru

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