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

3.10 Типы доступа

Значение типа доступа (значение доступа) предоставляет косвенный доступ к объекту или подпрограмме, на которую оно указывает. В зависимости от типа, значение доступа может указывать на подпрограммы, объекты, созданные аллокаторами (см. 4.8), или, более общо, на алиасированные объекты соответствующего типа.

Синтаксис

access_type_definition ::=
access_to_object_definition
| access_to_subprogram_definition
access_to_object_definition ::=
access [general_access_modifier] subtype_indication
general_access_modifier ::= all | constant
access_to_subprogram_definition ::=
access [protected] procedure parameter_profile
| access [protected] function parameter_and_result_profile
access_definition ::= access subtype_mark

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

Существует два вида типов доступа: access-to-object, значения которых указывают на объекты, и access-to-subprogram, значения которых указывают на подпрограммы. С типом access-to-object связан пул памяти; несколько типов доступа могут использовать один и тот же пул памяти. Все потомки типа доступа используют один и тот же пул памяти. Пул памяти — это область памяти, используемая для хранения динамически выделенных объектов (называемых элементами пула), созданных аллокаторами; пулы памяти описаны подробнее в 13.11, «Управление памятью».
Типы access-to-object далее подразделяются на специфичные для пула типы доступа, значения которых могут указывать только на элементы их связанного пула памяти, и общие типы доступа, значения которых могут указывать на элементы любого пула памяти, а также на алиасированные объекты, созданные объявлениями, а не аллокаторами, и алиасированные подкомпоненты других объектов.
Вид объекта определяется как алиасированный, если он определен с помощью object_declaration или component_definition с ключевым словом aliased или путем переименования алиасированного вида. Кроме того, ссылка на значение типа access-to-object обозначает алиасированный вид, как и преобразование вида (см. 4.6) алиасированного вида. Наконец, текущий экземпляр ограниченного типа, а также формальный параметр или формальный объект обобщения помеченного типа определяются как алиасированные. Алиасированные виды — это те, которые могут быть указаны значением доступа. Если вид, определенный с помощью object_declaration, является алиасированным и тип объекта имеет дискриминанты, то объект ограничен; если его номинальный подтип неограничен, то объект ограничен своим начальным значением. Аналогично, если объект, созданный allocator, имеет дискриминанты, объект ограничен либо назначенным подтипом, либо своим начальным значением.
access_to_object_definition определяет тип access-to-object и его первый подтип; subtype_indication определяет назначенный подтип типа доступа. Если появляется general_access_modifier, то тип доступа является общим типом доступа. Если модификатор является ключевым словом constant, то тип является типом доступа к константе; назначенный объект не может быть обновлен через значение такого типа. Если модификатор является ключевым словом all, то тип является типом доступа к переменной; назначенный объект может быть как читаем, так и обновляем через значение такого типа. Если в access_to_object_definition нет general_access_modifier, то тип доступа является специфичным для пула типом доступа к переменной.
access_to_subprogram_definition определяет тип access-to-subprogram и его первый подтип; parameter_profile или parameter_and_result_profile определяют назначенный профиль типа доступа. С назначенным профилем связан вызов конвенции; только подпрограммы с этой конвенцией вызова могут быть указаны значениями типа доступа. По умолчанию конвенция вызова — «protected», если присутствует ключевое слово protected, и «Ada» в противном случае. См. Приложение B о том, как переопределить этот параметр по умолчанию.
access_definition определяет анонимный общий тип доступа к переменной; subtype_mark обозначает его назначенный подтип. access_definition используется в спецификации дискриминанта доступа (см. 3.7) или параметра доступа (см. 6.1).
Для каждого (именованного) типа доступа существует литерал null, имеющий значение null доступа, которое не указывает на какой-либо объект. Значение null для именованного типа доступа — это значение по умолчанию для инициализации типа. Другие значения типа доступа получаются путем вычисления attribute_reference для атрибутов Access или Unchecked_Access алиасированного вида объекта или подпрограммы, не являющейся внутренней, или, в случае именованного типа доступа к объекту, allocator, который возвращает значение доступа, указывающее на только что созданный объект (см. 3.10.2).
Все подтипы типа доступа к подпрограмме ограничены. Первый подтип типа, определенного с помощью access_definition или access_to_object_definition, неограничен, если назначенный подтип является неограниченным массивом или подтипом с дискриминантами; в противном случае он ограничен.

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

composite_constraint совместим с неограниченным подтипом доступа, если он совместим с назначенным подтипом. Значение доступа удовлетворяет composite_constraint подтипа доступа, если оно равно значению null своего типа или если оно указывает на объект, значение которого удовлетворяет ограничению.
Выполнение access_type_definition создает тип доступа и его первый подтип. Для типа доступа к объекту это выполнение включает выполнение subtype_indication, которое создает назначенный подтип.
Выполнение access_definition создает анонимный общий тип доступа к переменной (это происходит в рамках инициализации параметра или дискриминанта доступа).
ПРИМЕЧАНИЯ
77 Значения доступа называются «указателями» или «ссылками» в некоторых других языках.
78 Каждый тип доступа к объекту имеет связанный пул памяти; несколько типов доступа могут использовать один и тот же пул. Объект может быть создан в пуле памяти типа доступа с помощью allocator (см. 4.8) для типа доступа. Пул памяти (приблизительно) соответствует тому, что в некоторых других языках называют «кучей». См. 13.11 для обсуждения пулов.
79 К типам доступа могут быть применены только index_constraintы и discriminant_constraintы (см. 3.6.1 и 3.7.1).

Примеры

Примеры типов доступа к объектам:
type Peripheral_Ref is access Peripheral; -- см. 3.8.1
type Binop_Ptr is access all Binary_Operation'Class;
-- общий доступ к классу, см. 3.9.1
Пример подтипа доступа:
subtype Drum_Ref is Peripheral_Ref(Drum); -- см. 3.8.1
Пример типа доступа к подпрограмме:
type Message_Procedure is access procedure (M : in String := "Ошибка!");
procedure Default_Message_Procedure(M : in String);
Give_Message : Message_Procedure := Default_Message_Procedure'Access;
...
procedure Other_Procedure(M : in String);
...
Give_Message := Other_Procedure'Access;
...
Give_Message("Файл не найден."); -- вызов с параметром (.all необязательно)
Give_Message.all; -- вызов без параметров


Spec-Zone.ru

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