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

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

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

Синтаксис

access_type_definition ::=
[null_exclusion] access_to_object_definition
| [null_exclusion] 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
null_exclusion ::= not null
access_definition ::=
[null_exclusion] access [constant] subtype_mark
| [null_exclusion] access [protected] procedure parameter_profile
| [null_exclusion] access [protected] function parameter_and_result_profile

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

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

Правила легитимности

Если subtype_indication, discriminant_specification, parameter_specification, parameter_and_result_profile, object_renaming_declaration или formal_object_declaration имеет null_exclusion, то subtype_mark в этой конструкции должен обозначать подтип доступа, который не исключает ноль.

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

Составной_ограничитель совместим с неограниченным подтипом доступа, если он совместим с назначенным подтипом. Исключение_нуля совместим с любым подтипом доступа, который не исключает нуль. Значение доступа удовлетворяет Составной_ограничитель подтипа доступа, если оно равно нулевому значению своего типа или если оно указывает на объект, значение которого удовлетворяет ограничению. Значение доступа удовлетворяет исключению нулевого значения, если оно не равно нулевому значению своего типа.
Разработка определения_типа_доступа создает тип доступа и его первый подтип. Для типа доступа к объекту эта разработка включает разработку указателя_подтипа, который создает назначенный подтип.
Разработка определения_доступа создает анонимный тип доступа.
ПРИМЕЧАНИЯ
80 Значения доступа называются «указателями» или «ссылками» в некоторых других языках.
81 Каждый тип доступа к объекту имеет связанный пул памяти; несколько типов доступа могут совместно использовать один и тот же пул. Объект может быть создан в пуле памяти типа доступа с помощью аллокатора (см. 4.8) для типа доступа. Пул памяти (приблизительно) соответствует тому, что в некоторых других языках называют «кучей». См. 13.11 для обсуждения пулов.
82 Только ограничение_индекса и ограничение_дискриминанта могут быть применены к типам доступа (см. 3.6.1 и 3.7.1).

Примеры

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


Spec-Zone.ru

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