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



         

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


Это будет не корректно для реализации функции Full по-умолчанию, которая наследуется от реализации связанного списка.

Согласно правил видимости Ады, явное публичное описание полностью скрывает неявное приватное описание, и, таким образом, приватное описание становится вообще не доступным.

Единственным способом вызвать функцию Full пакета Lists, будет явный вызов этой функции.

package body Stacks is

function Full(Item : Stack) return Boolean is

begin

-- вызов оригинальной функции Full из другого пакета return Lists.Full(Lists.List(Item)); -- конверсия типа параметра end Full;

. . .

end Stacks;

Все это выглядит ужасающе, но в чем заключается смысл таких требований Ады?

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

Таким образом, Ада просто предусматривает решение проблемы, которая является неизбежным последствием наличия различных пространств имен.

Вариант языка в котором отсутствуют пространства имен - еще хуже чем такое решение.

Поэтому, "не надо выключать пейджер, только потому, что не нравятся сообщения".

Это очень существенное замечание, и не следует двигаться дальше, пока суть этого замечания не понятна.

Вид всего тела пакета Stacks может быть следующим:

use Lists;

package body Stacks is

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

begin

Insert_At_Head(Item, Value); end 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; -- примечательно, что исключение объявленное в другом пакете -- "транслируется" в исключение описанное внутри этого пакета

function Full(Item : Stack) return Boolean is

begin

return Lists.Full(List(Item)); end Full;

function Empty(Item : Stack) return Boolean is

begin

return Lists.Empty(List(Item)); end Empty;

-- возвращает пустой проинициализированный стек function Init return Stack is

begin

return Stack(Lists.Init); end Init;

end Stacks;




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