Дочерние настраиваемые модули
Настраиваемые пакеты, подобно обычным пакетам Ады, могут иметь дочерние модули.
При этом, следует заметить, что такие дочерние модули также должны быть настраиваемыми модулями.
В качестве примера, предположим, что нам необходимо расширить настраиваемый пакет Stacks, который был показан в примере выше (см. 9.1.2).
Допустим, что нам необходимо добавить функцию Top, которая возвращает объект находящийся в вершине стека, но при этом не удаляет его из стека.
Чтобы решить эту задачу, мы можем, для настраиваемого пакета Stacks, описать дочерний настраиваемый пакет Stacks.Additions.
Спецификация Stacks.Additions может выглядеть следующим образом:
generic
package Stacks.Additions is function Top return Element; end Stacks.Additions; |
Примечательно, что дочерний настраиваемый модуль "видит" все компоненты своего родителя, включая все параметры настройки.
Тело дочернего настраиваемого модуля Stacks.Additions может иметь следующий вид:
package body Stacks.Additions is
function Top return Element is . . . end Stacks.Additions; |
Ниже демонстрируется пример конкретизации настраиваемых модулей Stacks и Stacks.Additions.
Конкретизация модуля Stacks формирует пакет Our_Stacks, что имеет вид:
with Stacks;
package Our_Stack is new Stack(Integer); |
Конкретизация модуля Stacks.Additions формирует пакет Our_Stack_Additions, что имеет вид:
with Our_Stack, Stacks.Additions;
package Our_Stack_Additions is new Stacks.Additions; |
Примечательно, что настраиваемый дочерний модуль рассматривается как описанный внутри настраиваемого родителя.