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

7.2 Тела пакетов

В отличие от сущностей, объявленных в видимой части пакета, сущности, объявленные в теле package_body, видны только внутри самого package_body. Вследствие этого пакет с package_body можно использовать для построения группы связанных подпрограмм, в которых логические операции, доступные клиентам, чётко изолированы от внутренних сущностей.

Синтаксис

package_body ::=
package body defining_program_unit_name is
declarative_part
[begin
handled_sequence_of_statements]
end [[parent_unit_name.]identifier];
Если в конце package_body появляется identifier или parent_unit_name.identifier, то эта последовательность лексем должна повторять defining_program_unit_name.

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

package_body должен быть завершением предыдущего package_declaration или generic_package_declaration. Пакетная package_declaration или generic_package_declaration библиотеки не должна иметь тело, если это не требуется; pragma Elaborate_Body можно использовать для того, чтобы потребовать, чтобы library_unit_declaration имел тело (см. 10.2.1), если он в противном случае не потребовал бы его.

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

В любом package_body без statements существует неявное null_statement. Для любого package_declaration без явного завершения существует неявное package_body, содержащий единственный null_statement. Для не-экземпляра, не-библиотечного пакета, это тело находится в конце declarative_part самого внутреннего окружающего программного блока или block_statement; если таких пакетов несколько, порядок неявных package_bodies не определён. (Для экземпляра неявный package_body находится в месте инстанцирования (см. 12.3). Для библиотечного пакета место частично определяется зависимостями разработки (см. раздел 10).)

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

Для разработки тела не-генерического package_body сначала выполняется разработка его declarative_part, а затем выполняется его handled_sequence_of_statements.
ПРИМЕЧАНИЯ
3 Переменная, объявленная в теле пакета, видна только внутри этого тела и, следовательно, её значение можно изменить только внутри package_body. При отсутствии локальных задач значение такой переменной остаётся неизменным между вызовами, выпущенными извне пакета, подпрограммам, объявленным в видимой части. Свойства такой переменной аналогичны свойствам «статической» переменной C.
4 Разработка тела подпрограммы, явно объявленной в видимой части пакета, вызывается разработкой тела пакета. Следовательно, вызов такой подпрограммы внешним программным блоком вызывает исключение Program_Error, если вызов происходит до разработки package_body (см. 3.11).

Примеры

Пример тела пакета (см. 7.1):
package body Rational_Numbers is
procedure Same_Denominator (X,Y : in out Rational) is
begin
-- приводит X и Y к одному знаменателю:
...
end Same_Denominator;
function "="(X,Y : Rational) return Boolean is
U : Rational := X;
V : Rational := Y;
begin
Same_Denominator (U,V);
return U.Numerator = V.Numerator;
end "=";
function "/" (X,Y : Integer) return Rational is
begin
if Y > 0 then
return (Numerator => X, Denominator => Y);
else
return (Numerator => -X, Denominator => -Y);
end if;
end "/";
function "+" (X,Y : Rational) return Rational is ... end "+";
function "-" (X,Y : Rational) return Rational is ... end "-";
function "*" (X,Y : Rational) return Rational is ... end "*";
function "/" (X,Y : Rational) return Rational is ... end "/";
end Rational_Numbers;


Spec-Zone.ru

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