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

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 полного вида.
ПРИМЕЧАНИЯ
8 Поскольку частичный вид и полный вид являются двумя различными представлениями одного и того же типа, за пределами определяющего пакета характеристики типа определяются видимой частью. Внутри этих внешних программных модулей тип является просто закрытым типом или закрытым расширением, и любое языковое правило, применимое только к другому классу типов, не применяется. Тот факт, что полное объявление может реализовывать закрытый тип с типом определённого класса (например, как тип массива), имеет значение только внутри области объявления пакета самого пакета, включая любые дочерние модули.
Однако следствия этой фактической реализации действительны везде. Например: любое начальное значение компонентов происходит; атрибут Size предоставляет размер полного вида; завершение всё ещё выполняется для контролируемых компонентов полного вида; правила зависимости задач всё ещё применяются к компонентам, которые являются объектами задач.
9 Частичные представления обеспечивают присваивание (если представление не ограничено), проверки на членство, выбранные компоненты для выбора дискриминантов и наследованных компонентов, квалификацию и явное преобразование.
10 Для подтипа 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;
ПРИМЕЧАНИЯ
11 Примечания по примеру: За пределами пакета 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