В качестве параметра настройки для настраиваемого модуля может быть передана подпрограмма.
Необходимость в параметрах-подпрограммах чаще всего возникает когда какой-либо формальный параметр-тип настраиваемого модуля описан как приватный или лимитированный приватный тип.
В таких случаях, Ада накладывает традиционные ограничения на использование операций над экземплярами данного типа внутри тела настраиваемого модуля.
Однако, при этом может возникнуть необходимость в осуществлении сравнения или выполнения проверки на равенство значений данного типа, внутри тела настраиваемого модуля.
Следовательно, параметры-подпрограммы являются механизмом, который предоставляет для компилятора информацию о том как осуществлять эти действия.
В качестве примера рассмотрим типичный случай требующий применение параметров-подпрограмм.
Предположим, что в качестве одного из параметров настраиваемого модуля используется лимитированый приватный тип.
Тогда, для этого лимитированного приватного типа, с помощью параметров-подпрограмм, можно осуществить передачу операций: проверка на равенство и присваивание.
generic
type Element is limited private; with function "="(E1, E2 : Element) return Boolean; with procedure Assign(E1, E2 : Element); package Stuff is . . . |
Конкретизация такого настраиваемого модуля может иметь вид:
package Things is new Stuff(Person, Text."=", Text.Assign); |
Для формального параметра-подпрограммы может быть указана подпрограмма используемая по-умолчанию. Тогда, при конкретизации настраиваемого модуля, фактический параметр-подпрограмма может не указываться.
Предположим, что у нас есть подпрограмма, спецификация которой имеет вид:
procedure My_Assign(E1, E2 : Person); |
Тогда, при описании формального параметра-подпрограммы Assign, мы можем указать процедуру My_Assign как подпрограмму которую необходимо использовать по-умолчанию следующим образом:
generic
type Element is limited private; with function "="(E1, E2 : Element) return Boolean; with procedure Assign(E1, E2 : Element) is My_Assign(E1, E2 : Person); package Stuff is . . . |