Контролируемые или не контролируемые?
Когда главный тип абстракции является производным от Ada.Finalization.Controlled, то вызовы Initialize, Adjust и Finalize
автоматически выполняются компилятором (так указывается в руководстве по языку).
Это полезно для предотвращения утечек памяти (компилятор никогда не забудет удалить объект, который больше не используется).
Это полезно при дублировании объекта: две копии могут быть сделаны независимыми.
Однако эти свойства должны использоваться только в случаях, когда традиционное поведение компилятора, принятое по умолчанию, не удовлетворяет потребности разрабатываемой абстракции.
Действительно, как только главный тип абстракции описан как контролируемый, то программист обязан заботиться о контролируемой обработке для каждого потомка.
Таким образом, если потоммок добавляет какое-либо расширение, то унаследованные операции Initialize, Adjust и Finalize
не имеют никакого представления о таком расширении.
Следовательно, вы обязаны переопределять эти операции для потомков вашей абстракции.