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

7.5 Ограниченные типы

Ограниченный тип — это (вид) тип, для которого запрещено копирование (например, в операторе присваивания). Неограниченный тип — это (вид) тип, для которого копирование разрешено.

Правила допустимости

Если помеченный тип записи содержит какие-либо ограниченные компоненты, то ключевое слово limited должно присутствовать в его определении типа записи record_type_definition. Если ключевое слово limited присутствует в определении типа derived_type_definition, его родительский тип и любые интерфейсы-предшественники должны быть ограниченными.
В следующих контекстах выражение ограниченного типа не допускается, если это не агрегат, вызов функции, выражение в скобках или квалифицированное выражение, операнд которого разрешен этим правилом, или условное выражение, все зависимые выражения которого разрешены этим правилом:
  • выражение инициализации объекта объявления object_declaration (см. 3.3.1)
  • выражение по умолчанию компонента объявления component_declaration (см. 3.8)
  • выражение компонента ассоциации записи record_component_association (см. 4.3.1)
  • выражение части предка агрегата расширения extension_aggregate (см. 4.3.2)
  • выражение позиционного агрегата массива positional_array_aggregate или выражение ассоциации компонента массива array_component_association (см. 4.3.3)
  • квалифицированное выражение инициализированного аллокатора (см. 4.8)
  • выражение оператора возврата (см. 6.5)
  • выражение возврата функции-выражения (см. 6.8)
  • выражение по умолчанию или фактический параметр для формального объекта с режимом in (см. 12.4)

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

Вид типа является ограниченным, если он относится к одному из следующих:
  • тип с ключевым словом limited, synchronized, task или protected в его определении;
  • тип-класс, конкретный тип которого является ограниченным;
  • составной тип с ограниченным компонентом;
  • неполный вид;
  • производный тип, родительский тип которого ограничен и не является интерфейсом.
В противном случае тип является неограниченным.
Для ограниченного типа не определены предопределённые операторы равенства.
Тип является неизменно ограниченным, если он относится к одному из следующих:
  • Явно ограниченный тип записи;
  • Расширение записи с ключевым словом limited;
  • Неформальный ограниченный тип-приватный, который является помеченным или имеет по крайней мере один дискриминант доступа с выражением по умолчанию default_expression;
  • Тип задачи, тип защищенного типа или синхронизированный интерфейс;
  • Тип, производный от неизменно ограниченного типа.
Потомок формального ограниченного приватного типа предполагается неизменно ограниченным, за исключением тела генерического блока или тела, объявленного в области объявления генерического блока, если формальный тип объявлен в формальной части генерического блока.
ПРИМЕЧАНИЯ
15 Хотя разрешено записывать инициализации ограниченных объектов, такие инициализации никогда не копируют ограниченный объект. Источником такой операции присваивания должен быть агрегат или вызов функции, а такие агрегаты и вызовы функций должны быть построены непосредственно в целевом объекте (см. 7.6).
Абзацы с 10 по 15 были удалены.
16 Как показано в 7.3.1, неопознанный ограниченный тип может стать неограниченным при определённых обстоятельствах.

Примеры

Пример пакета с ограниченным типом:
package IO_Package is
type File_Name is limited private;
procedure Open (F : in out File_Name);
procedure Close(F : in out File_Name);
procedure Read (F : in File_Name; Item : out Integer);
procedure Write(F : in File_Name; Item : in Integer);
private
type File_Name is
limited record
Internal_Name : Integer := 0;
end record;
end IO_Package;
package body IO_Package is
Limit : constant := 200;
type File_Descriptor is record ... end record;
Directory : array (1 .. Limit) of File_Descriptor;
...
procedure Open (F : in out File_Name) is ... end;
procedure Close(F : in out File_Name) is ... end;
procedure Read (F : in File_Name; Item : out Integer) is ... end;
procedure Write(F : in File_Name; Item : in Integer) is ... end;
begin
...
end IO_Package;
ПРИМЕЧАНИЯ
17 Примечания к примеру: В примере выше внешняя подпрограмма, использующая IO_Package, может получить имя файла, вызвав Open, и затем использовать его в вызовах Read и Write. Таким образом, вне пакета имя файла, полученное из Open, действует как своего рода пароль; его внутренние свойства (например, содержащее числовое значение) не известны, и другие операции (например, сложение или сравнение внутренних имён) не могут выполняться с именем файла. Важно, что клиенты пакета не могут создавать копии объектов типа File_Name.
Этот пример характерен для любого случая, когда требуется полный контроль над операциями типа. Такие пакеты служат двойной цели. Они предотвращают использование пользователем внутренней структуры типа. Они также реализуют понятие инкапсулированного типа данных, где единственные операции над типом — это те, которые приведены в спецификации пакета.
Тот факт, что полный вид File_Name явно объявлен limited, означает, что передача параметров всегда будет по ссылке, а результаты функций всегда будут создаваться непосредственно в результирующем объекте (см. 6.2 и 6.5).


Spec-Zone.ru

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