Spec-Zone.ru › Ada 2022
Руководство по Ada (Ada 2022)

7.3 Типы с частной частью и частные расширения

Объявление (в видимой части пакета) типа как типа с частной частью или частного расширения служит для разделения характеристик, которые могут быть использованы напрямую внешними программными модулями (то есть логические свойства), от других характеристик, прямой доступ к которым ограничен пакетом (детали определения самого типа). См. 3.9.1 для обзора расширений типов.

Синтаксис

private_type_declaration ::=
type defining_identifier [discriminant_part] is [[abstract] tagged] [limited] private
[aspect_specification];
private_extension_declaration ::=
type defining_identifier [discriminant_part] is
[abstract] [limited | synchronized] new ancestor_subtype_indication
[and interface_list] with private
[aspect_specification];

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

private_type_declaration или private_extension_declaration объявляют частичный вид типа; такое объявление допускается только как declarative_item видимой части пакета, и оно требует завершения, которое должно быть full_type_declaration, который выступает как declarative_item закрытой части пакета. Вид типа, объявленный full_type_declaration, называется полным видом. Генерические формальные типы с частной частью или генерические формальные частные расширения также являются частичными видами.
Тип должен быть полностью определен до его заморозки (см. 3.11.1 и 13.14). Таким образом, ни объявление переменной частичного вида типа, ни создание объектом allocator объекта частичного вида не допускаются до полного объявления типа. Аналогично, до полного объявления имя частичного вида не может быть использовано в generic_instantiation или в элементе представления.
Тип с частной частью считается ограниченным, если его объявление включает зарезервированное слово limited; частное расширение ограничено, если тип предка является ограниченным типом, который не является типом интерфейса, или если зарезервированные слова limited или synchronized появляются в его определении. Если частичный вид неограничен, то полный вид должен быть неограниченным. Если частичный вид помечен тегом и ограничен, то полный вид должен быть ограничен. С другой стороны, если частичный вид непомечен тегом и ограничен, полный вид может быть ограниченным или неограниченным.
Если частичный вид помечен тегом, то полный вид должен быть помечен тегом. С другой стороны, если частичный вид непомечен тегом, то полный вид может быть помечен тегом или непомечен тегом. В случае, когда частичный вид непомечен тегом, а полный вид помечен тегом, производные частичного вида не допускаются в непосредственной области действия частичного вида; производные полного вида допускаются.
Если полный тип имеет частичный вид, который помечен тегом, то:
  • частичный вид должен быть синхронизированным помеченным типом (см. 3.9.4), если и только если полный тип является синхронизированным помеченным типом;
  • частичный вид должен быть потомком типа интерфейса (см. 3.9.4), если и только если полный тип является потомком типа интерфейса.
Предковый подтип private_extension_declaration — это подтип, определенный ancestor_subtype_indication; тип предка должен быть конкретным помеченным типом. Полный вид частного расширения должен быть производным (прямо или косвенно) от типа предка. В дополнение к местам, где обычно применяются правила легальности (см. 12.3), требование, чтобы предок был конкретным, применяется также в закрытой части экземпляра генерического модуля.
Если в private_extension_declaration появляется зарезервированное слово limited, тип предка должен быть ограниченным типом. Если в private_extension_declaration появляется зарезервированное слово synchronized, тип предка должен быть ограниченным интерфейсом.
Если объявление частичного вида включает known_discriminant_part, то full_type_declaration должен иметь полностью соответствующий (явный) known_discriminant_part (см. 6.3.1). Предковый подтип может быть неограниченным; родительский подтип полного вида должен быть ограниченным (см. 3.7).
Если частное расширение наследует известные дискриминанты от предкового подтипа, то полный вид также должен унаследовать свои дискриминанты от предкового подтипа, а родительский подтип полного вида должен быть ограниченным тогда и только тогда, когда предковый подтип является ограниченным.
Если full_type_declaration для частного расширения включает derived_type_definition, то зарезервированное слово limited должно появляться в full_type_declaration тогда и только тогда, когда оно также появляется в private_extension_declaration.
Если частичный вид имеет неизвестные дискриминанты, то full_type_declaration может определить определенный или неопределенный подтип с или без дискриминантов.
Если частичный вид не имеет ни известных, ни неизвестных дискриминантов, то full_type_declaration должен определить определенный подтип.
Если предковый подтип частного расширения имеет ограниченные дискриминанты, то родительский подтип полного вида должен накладывать статически соответствующее ограничение на эти дискриминанты.

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

private_type_declaration объявляет тип с частной частью и его первый подтип. Аналогично, private_extension_declaration объявляет частное расширение и его первый подтип.
Объявление частичного вида и соответствующее full_type_declaration определяют два вида одного типа. Объявление частичного вида вместе с видимой частью определяют операции, доступные внешним программным модулям; объявление полного вида вместе с закрытой частью определяют другие операции, прямой доступ к которым возможен только в области объявления самого пакета. Кроме того, в области действия объявления полного вида характеристики (см. 3.4) типа определяются полным видом; в частности, в своей области полный вид определяет классы, включающие тип, какие компоненты, записи и защищенные подпрограммы видимы, какие атрибуты и другие предопределенные операции разрешены, и является ли первый подтип статическим. См. 7.3.1.
Для частного расширения характеристики (включая компоненты, но исключая дискриминанты, если указана новая discriminant_part), предопределенные операторы и унаследованные пользовательские примитивные подпрограммы определяются типом предка и его родовыми типами (если таковые имеются), так же, как и для расширения записи определяются типом родителя и его родовыми типами (см. 3.4 и 7.3.1).

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

Выполнение private_type_declaration создает частичный вид типа. Выполнение private_extension_declaration выполняет ancestor_subtype_indication и создает частичный вид типа.
ПРИМЕЧАНИЕ 1 Частичный вид типа, как объявлен private_type_declaration, определяется как составной вид (в 3.2). Полный вид типа может быть элементарным или составным. Частное расширение также является составным, как и его полный вид.
ПРИМЕЧАНИЕ 2 Объявление приватного типа с unknown_discriminant_part — способ предотвратить создание клиентами неинициализированных объектов этого типа; в таком случае каждый объект должен быть инициализирован вызовом какой-либо операции, объявленной в видимой части пакета.
ПРИМЕЧАНИЕ 3 Тип предка, указанный в private_extension_declaration, и тип родителя, указанный в соответствующем объявлении расширения записи, приведенном в приватной части, могут отличаться. Если тип предка не является типом интерфейса, тип родителя полного вида может быть любым потомком типа предка. В этом случае для примитивного подпрограммы, унаследованной от типа предка и не переопределённой, имена формальных параметров и выражения по умолчанию (если таковые имеются) берутся из соответствующего примитивного подпрограммы указанного типа предка, а тело — из соответствующего примитивного подпрограммы типа родителя полного вида. См. 3.9.2.
ПРИМЕЧАНИЕ 4 Если тип предка, указанный в private_extension_declaration, является типом интерфейса, тип родителя может быть любым типом, при условии, что полный вид является потомком типа предка. Типы предков, указанные в private_extension_declaration, и типы предков, указанные в соответствующем объявлении расширения записи, приведённом в приватной части, не обязательно совпадают — необходимо только, чтобы частное расширение и расширение записи происходили от одного и того же набора интерфейсов.

Примеры

Примеры объявлений приватных типов:
type Ключ is private;
type Имя_файла is limited private;
Пример объявления приватного расширения:
type Список is new Ada.Finalization.Controlled with private;


Spec-Zone.ru

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