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

7.3.1 Закрытые операции

Для типа, объявленного во видимой части пакета или обобщенного пакета, некоторые операции над типом становятся видимыми только позже в пакете — либо в закрытой части, либо в теле. Такие закрытые операции доступны только внутри области объявления пакета или обобщенного пакета.

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

Предопределенные операторы, существующие для данного типа, определяются классами, к которым относится тип. Например, целочисленный тип имеет предопределенный оператор "+". В большинстве случаев предопределенные операторы типа объявляются сразу после определения типа; исключения объяснены ниже. Наследуемые подпрограммы также неявно объявляются сразу после определения типа, за исключением случаев, указанных ниже.
Для составного типа характеристики (см. 7.3) типа частично определяются характеристиками его компонентных типов. В месте объявления составного типа используются только те характеристики компонентных типов, которые видимы в этом месте. Если позже, непосредственно в области объявления составного типа, становятся видимыми дополнительные характеристики для компонентного типа, то соответствующие характеристики становятся видимыми для составного типа. Любые дополнительные предопределенные операторы неявно объявляются в этом месте.
Соответствующее правило применяется к типу, определенному с помощью derived_type_definition, если существует место непосредственно внутри области объявления типа, где становятся видимыми дополнительные характеристики его родительского типа.
Например, тип массива, компонентный тип которого является ограниченно закрытым, становится неограниченным, если полное представление компонентного типа является неограниченным и видимым в некотором более позднем месте непосредственно в области объявления типа массива. В таком случае предопределенный оператор "=" неявно объявляется в этом месте, и присваивание разрешается после этого места.
Наследуемые примитивные подпрограммы следуют другому правилу. Для derived_type_definition каждая наследуемая примитивная подпрограмма неявно объявляется в самом раннем месте, если таковое имеется, непосредственно в области объявления type_declaration, но после type_declaration, где соответствующее объявление из родителя является видимым. Если такого места нет, то наследуемая подпрограмма не объявляется вообще. Наследуемая подпрограмма, которая не объявлена вообще, не может быть названа в вызове и не может быть переопределена, но для помеченного типа возможно перенаправление на нее.
Для private_extension_declaration каждая наследуемая подпрограмма объявляется сразу после private_extension_declaration, если соответствующее объявление от предка является видимым в этом месте. В противном случае наследуемая подпрограмма не объявляется для расширения, хотя она может быть для полного типа.
Атрибут Class определен для помеченных подтипов в 3.9. Кроме того, для каждого подтипа S неопознанного закрытого типа, полное представление которого помечено, определен следующий атрибут:
S'Class
Обозначает подтип, соответствующий типу с полным представлением S. Этот атрибут разрешен только с начала закрытой части, в которой объявлено полное представление, до объявления полного представления. После полного представления можно использовать атрибут Class полного представления.
ПРИМЕЧАНИЯ
9 Поскольку частичное представление и полное представление являются двумя разными представлениями одного и того же типа, за пределами определяющего пакета характеристики типа определяются видимой частью. Внутри этих внепрограммных модулей тип — это просто закрытый тип или закрытое расширение, и любое языковое правило, применимое только к другому классу типов, не применяется. Тот факт, что полное объявление может реализовывать закрытый тип с типом определенного класса (например, как тип массива), имеет значение только внутри области объявления пакета, включая любые дочерние модули.
Однако последствия этой фактической реализации действительны везде. Например: любая начальная инициализация компонентов происходит; атрибут Size предоставляет размер полного представления; окончательная инициализация по-прежнему выполняется для управляемых компонентов полного представления; правила зависимости задач по-прежнему применяются к компонентам, которые являются объектами задач.
10 Частичные представления обеспечивают инициализацию, проверки на принадлежность, выбранные компоненты для выбора дискриминантов и наследуемых компонентов, квалификацию и явное преобразование.
11 Для подтипа S частичного представления определен S'Size (см. 13.3). Для объекта A частичного представления определены атрибуты A'Size и A'Address (см. 13.3). Атрибуты Position, First_Bit и Last_Bit также определены для дискриминантов и наследуемых компонентов.

Примеры

Пример типа с закрытыми операциями:
package Key_Manager is
type Key is private;
Null_Key : constant Key; -- отложенное объявление константы (см. 7.4)
procedure Get_Key(K : out Key);
function "<" (X, Y : Key) return Boolean;
private
type Key is new Natural;
Null_Key : constant Key := Key'First;
end Key_Manager;
package body Key_Manager is
Last_Key : Key := Null_Key;
procedure Get_Key(K : out Key) is
begin
Last_Key := Last_Key + 1;
K := Last_Key;
end Get_Key;
function "<" (X, Y : Key) return Boolean is
begin
return Natural(X) < Natural(Y);
end "<";
end Key_Manager;
ПРИМЕЧАНИЯ
12 Примечания к примеру: Внешние для пакета Key_Manager операции, доступные для объектов типа Key, включают присваивание, сравнение на равенство или неравенство, процедуру Get_Key и оператор "<"; они не включают другие реляционные операторы, такие как ">=", или арифметические операторы.
Явно объявленный оператор "<" скрывает предопределенный оператор "<", неявно объявленный full_type_declaration. В теле функции необходимо явное преобразование X и Y в подтип Natural, чтобы вызвать оператор "<" родительского типа. В качестве альтернативы, результат функции можно записать как not (X >= Y), поскольку оператор ">=" не переопределен.
Значение переменной Last_Key, объявленной в теле пакета, остается неизменным между вызовами процедуры Get_Key. (См. также ПРИМЕЧАНИЯ к 7.2.)


Spec-Zone.ru

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