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

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

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

Синтаксис

объявление_типа_с_закрытой_частью ::=
type идентификатор_определения [часть_дискриминантов] is [[abstract] tagged] [limited] private;
объявление_расширения_типа_с_закрытой_частью ::=
type идентификатор_определения [часть_дискриминантов] is
[abstract] new предок_индикация_подтипа with private;

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

Объявление объявление_типа_с_закрытой_частью или объявление_расширения_типа_с_закрытой_частью объявляет частичный вид типа; такое объявление разрешено только как элемент_объявления видимой части пакета, и оно требует завершения, которое должно быть полное_объявление_типа, которое встречается как элемент_объявления закрытой части пакета. Вид типа, объявленный полное_объявление_типа, называется полным видом. Также, формальный тип с закрытой частью или формальное расширение типа с закрытой частью являются частичным видом.
Тип должен быть полностью определен до того, как он будет заморожен (см. 3.11.1 и 13.14). Таким образом, ни объявление переменной частичного вида типа, ни создание объектом аллокатора объекта частичного вида не допускаются до полного объявления типа. Аналогично, до полного объявления имя частичного вида не может использоваться в генерическое_подстановки или в элементе представления.
Тип с закрытой частью является ограниченным, если его объявление включает зарезервированное слово limited; расширение типа с закрытой частью является ограниченным, если его тип-предок ограничен. Если частичный вид неограничен, то полный вид должен быть неограниченным. Если частичный вид помечен как tagged и ограничен, то полный вид должен быть ограниченным. С другой стороны, если частичный вид не помечен как tagged и ограничен, полный вид может быть ограниченным или неограниченным.
Если частичный вид помечен как tagged, то полный вид должен быть помечен как tagged. С другой стороны, если частичный вид не помечен как tagged, то полный вид может быть помечен как tagged или нет. В случае, когда частичный вид не помечен как tagged, а полный вид помечен как tagged, производные от частичного вида не допускаются в непосредственной области видимости частичного вида; производные от полного вида допускаются.
Подтип предка объявление_расширения_типа_с_закрытой_частью — это подтип, определенный индикация_подтипа предка; тип-предок должен быть конкретным помеченным типом. Полный вид расширения типа с закрытой частью должен быть производным (прямо или косвенно) от типа-предка. В дополнение к местам, где обычно применяются правила легальности (см. 12.3), требование о том, что предок должен быть конкретным, применяется также в закрытой части экземпляра обобщенного модуля.
Если объявление частичного вида включает известную_часть_дискриминантов, то полное_объявление_типа должно иметь полностью соответствующую (явную) известную_часть_дискриминантов (см. 6.3.1, «Правила соответствия»). Подтип-предок может быть не ограниченным; подтип-родитель полного вида должен быть ограниченным (см. 3.7).
Если расширение типа с закрытой частью наследует известные дискриминанты от подтипа-предка, то полный вид также должен наследовать свои дискриминанты от подтипа-предка, и подтип-родитель полного вида должен быть ограниченным тогда и только тогда, когда подтип-предок является ограниченным.
Если частичный вид имеет неизвестные дискриминанты, то полное_объявление_типа может определить определенный или неопределенный подтип с или без дискриминантов.
Если частичный вид не имеет ни известных, ни неизвестных дискриминантов, то полное_объявление_типа должно определять определенный подтип.
Если подтип-предок расширения типа с закрытой частью имеет ограниченные дискриминанты, то подтип-родитель полного вида должен накладывать статически соответствующее ограничение на эти дискриминанты.

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

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

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

Выполнение объявление_типа_с_закрытой_частью создает частичный вид типа. Выполнение объявление_расширения_типа_с_закрытой_частью выполняет индикация_подтипа предка и создает частичный вид типа.
ПРИМЕЧАНИЯ
5 Частичный вид типа, как объявленный объявление_типа_с_закрытой_частью, определяется как составной вид (в 3.2). Полный вид типа может или не может быть составным. Расширение типа с закрытой частью также составное, как и его полный вид.
6 Объявление типа с закрытой частью с неизвестной_частью_дискриминантов — это способ предотвращения создания клиентами неопределенных объектов типа; тогда они вынуждены инициализировать каждый объект, вызвав некоторую операцию, объявленную в видимой части пакета. Если такой тип также ограничен, то ни один объект типа не может быть объявлен за пределами области полное_объявление_типа, ограничивая все создание объектов пакетом, определяющим тип. Это позволяет полностью контролировать все выделение памяти для типа. Тем не менее, объекты такого типа по-прежнему могут передаваться в качестве параметров.
7 Тип-предок, указанный в объявление_расширения_типа_с_закрытой_частью, и родительский тип, указанный в соответствующем объявлении расширения записи, заданном в закрытой части, не обязательно должны быть одинаковыми — родительский тип полного вида может быть любым потомком типа-предка. В этом случае для примитивной подпрограммы, которая наследуется от типа-предка и не переопределяется, имена формальных параметров и выражения по умолчанию (если таковые имеются) берутся из соответствующей примитивной подпрограммы указанного типа-предка, в то время как тело берется из соответствующей примитивной подпрограммы родительского типа полного вида. См. 3.9.2.

Примеры

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


Spec-Zone.ru

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