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

3.9 Размеченные типы и расширения типов

Размеченные типы и расширения типов поддерживают объектно-ориентированное программирование, основанное на наследовании с расширением и полиморфизмом во время выполнения посредством операций диспетчеризации.

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

Тип записи или частный тип, содержащий зарезервированное слово tagged в своем объявлении, называется размеченным типом. При выводе из размеченного типа могут быть определены дополнительные компоненты. Как и для любого производного типа, могут быть определены дополнительные примитивные подпрограммы, а унаследованные примитивные подпрограммы могут быть переопределены. Производный тип называется расширением типа предка или просто расширением типа. Каждое расширение типа также является размеченным типом и является либо расширением записи, либо расширением частного типа некоторого другого размеченного типа. Расширение записи определяется derived_type_definition с record_extension_part. Расширение частного типа, представляющее собой частичный вид расширения записи, может быть объявлено во видимой части пакета (см. 7.3) или в общем формальном разделе (см. 12.5.1).
Объект размеченного типа имеет связанный (во время выполнения) тег, который идентифицирует конкретный размеченный тип, используемый для первоначального создания объекта. Тег операнда типа размеченного класса T'Class контролирует, какой тело подпрограммы будет выполнено при применении примитивной подпрограммы типа T к операнду (см. 3.9.2); использование тега для управления тем, какое тело выполнить, называется диспетчеризацией.
Тег конкретного размеченного типа идентифицирует full_type_declaration типа. Если объявление размеченного типа встречается внутри generic_package_declaration, то соответствующие объявления типов в различных экземплярах общего пакета связаны с различными тегами. Для размеченного типа, который является локальным для тела общего пакета, язык не определяет, приводят ли повторные экземпляры общего тела к различным тегам.
Существует следующий определяемый языком библиотечный пакет:
package Ada.Tags is
type Tag is private;
function Expanded_Name(T : Tag) return String;
function External_Tag(T : Tag) return String;
function Internal_Tag(External : String) return Tag;
Tag_Error : exception;
private
... -- не определено языком
end Ada.Tags;
Функция Expanded_Name возвращает полное расширенное имя первого подтипа конкретного типа, идентифицированного тегом, заглавными буквами, начиная с корневого библиотечного модуля. Результат зависит от реализации, если тип объявлен внутри неопределенного block_statement.
Функция External_Tag возвращает строку, которая должна использоваться во внешнем представлении для данного тега. Вызов External_Tag(S'Tag) эквивалентен attribute_reference S'External_Tag (см. 13.3).
Функция Internal_Tag возвращает тег, соответствующий данному внешнему тегу, или вызывает Tag_Error, если данная строка не является внешним тегом для какого-либо конкретного типа раздела.
Для каждого подтипа S размеченного типа T (конкретного или общего), определены следующие атрибуты:
S'Class
S'Class обозначает подтип типа класса (называемый T'Class в этом Международном стандарте) для класса, укоренённого в T (или если S уже обозначает подтип класса, то S'Class совпадает с S).
S'Class не ограничен. Однако, если S ограничен, то значения S'Class — это только те, которые при преобразовании в тип T принадлежат S.
S'Tag
S'Tag обозначает тег типа T (или если T является общим, тег корневого типа соответствующего класса). Значение этого атрибута имеет тип Tag.
Учитывая prefix X, который является типом размеченного класса (после любого неявного разыменования), определен следующий атрибут:
X'Tag
X'Tag обозначает тег X. Значение этого атрибута имеет тип Tag.

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

Тег, связанный с объектом размеченного типа, определяется следующим образом:
  • Тег автономного объекта, компонента или агрегата конкретного размеченного типа T идентифицирует T.
  • Тег объекта, созданного аллокатором для типа доступа со специфицированным размеченным типом T, идентифицирует T.
  • Тег объекта типа размеченного класса — это тег его выражения инициализации.
  • Тег результата, возвращаемого функцией, тип результата которой — конкретный размеченный тип T, идентифицирует T.
  • Тег результата, возвращаемого функцией с общим типом результата, — это тег выражения возврата.
Тег сохраняется при преобразовании типов и передаче параметров. Тег значения — это тег связанного объекта (см. 6.2).

Разрешения реализации

Реализация функций в Ada.Tags может вызвать Tag_Error, если в разделе в момент вызова функции не существует соответствующего конкретного типа, соответствующего тегу, переданному в качестве параметра.
ПРИМЕЧАНИЯ
62 Тип, объявленный с зарезервированным словом tagged, обычно должен быть объявлен в package_specification, чтобы можно было объявить новые примитивные подпрограммы для него.
63 После создания объекта его тег никогда не меняется.
64 Типы класса определены как имеющие неизвестные дискриминанты (см. 3.7). Это означает, что объекты типа класса должны быть явно инициализированы (будь то созданы с помощью object_declaration или allocator), а aggregates должны быть явно квалифицированы конкретным типом при их ожидаемом типе — типе класса.
65 Если S обозначает неопределенный частный тип, полный тип которого размечен, то S'Class также разрешен перед полным определением типа, но только в частной части пакета, в котором объявлен тип (см. 7.3.1). Аналогично, атрибут Class определен для неполных типов, полный тип которых размечен, но только в пределах библиотечного модуля, в котором неполный тип объявлен (см. 3.10.1).

Примеры

Примеры размеченных типов записей:
type Point is tagged
record
X, Y : Real := 0.0;
end record;
type Expression is tagged null record;
-- Компоненты будут добавлены каждым расширением


Spec-Zone.ru

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