Ада-95. Компилятор GNAT



         

Еще один пример стека - часть 2


/p>

Теперь нам необходимо установить связь между неявно описанными подпрограммами (унаследованными от типа List), и подпрограммами, которые должны быть публично доступны.

Это достаточно просто выполняется с помощью механизма "транзитного вызова".

package body Stacks is

procedure Push(Item : in out Stack; Value : in Integer) is

begin

Insert_At_Head(Item, Value); end Push; -- эту процедуру можно сделать более эффективной, используя: pragma Inline(Push);

procedure Pop(Item : in out Stack; Value : out Integer) is

begin

Remove_From_Head(Item, Value); exception => when Lists.Underflow => raise Stacks.Underflow; end Pop;

. . .

end Stacks;

Следует заметить, что все это справедливо для публично описанных подпрограмм, имена которых отличаются от имен неявно описанных подпрограмм (тех, которые унаследованы от типа List).

Однако, в спецификации пакета, присутствуют две функции Full, которые имеют профиль:

function Full(Item : Stack) return Boolean;

В данном случае, одна функция описана в публично доступной секции, а вторая, неявно описана в приватной секции.

Что же происходит на самом деле?

Спецификация первой функции в публично доступной секции пакета - это только обещание предоставить эту функцию.

Таким образом, это еще не реализованая функция, ее реализация будет выполнена где-то в теле пакета.

Кроме этой функции существует другая, неявно описанная функция, которая, по-случаю, имеет такие же имя и профиль.

Компилятор Ады может обнаружить, что обе функции имеют одинаковые имя и профиль, но он ничего не предполагает о том, что публично описанная функция должна быть реализована приватной функцией.

Например, предположим, что Lists.Full всегда возвращает "ложь" (False), для индикации того, что связанный список никогда не заполнен полностью и всегда может увеличиваться.

Разработчику стекового пакета может понадобиться принудительное ограничение размера стека.

Например, так чтобы стек мог содержать максимум 100 элементов.

После чего разработчик стекового пакета соответствующим образом пишет функцию Stacks.Full.




Содержание  Назад  Вперед