Эти операции присутствуют в Ada по умолчанию. Если же нужно управлять ими, то при описании соответствующих объектов используют контролируемые (controlled) типы.
Чтобы создать контролируемый тип, необходимо просто сделать его потомком типа "Controlled" или "Limited_Controlled". Эти типы описаны в предопределенном пакете "Ada.Finalization". Используйте "Controlled", когда необходимо управлять всемя тремя операциями, и "Limited_Controlled" - когда не нужно управлять присваиванием.
Ниже приведено частичное объявление пакета Ada.Finalization:
type Controlled is abstract tagged private; procedure Initialize(Object : in out Controlled); procedure Adjust (Object : in out Controlled); procedure Finalize (Object : in out Controlled); type Limited_Controlled is abstract tagged limited private; procedure Initialize(Object : in out Limited_Controlled); procedure Finalize (Object : in out Limited_Controlled);
Как только вы создадите свой тип, являющийся потомком Controlled или Limited_Controlled, можно будет переопределить подпрограммы Initialize, Adjust или Finalize и делать с ними все, что угодно. Всякий раз, когда будет создаваться объект данного типа, Ada выполнит свои собственные операции инициализации а затем вызовет подпрограмму "Initialize", описанную пользователем. Каждый раз, когда объект данного типа должен быть уничтожен (например, при выходе из подпрограммы, в которой он был определен), будет выполнена подпрограмма "Finalize".
Точно также можно управлять операцией присваивания (:=) типов, наследуемых от Controlled. Тогда, во время выполнения операции типа "A := B;", сначала выполнится обычное присваивание, а затем - подпрограмма "Adjust".
Кое-кто (особенно те, кто знаком с C++) может спросить: ``А что происходит, если переменной присваивается ее собственное значение, например "A := A"''?. Ada корректно обрабатывает такую ситуацию благодаря "аккуратному" определению оператора присваивания, использующему концепцию "безымянного объекта" (самоприсваивание - это распространенный источник ошибок в C++) . Большинство компиляторов, выполня различные опитмизации, как правило, отбрасывают промежуточный "безымянный объект".
Управляемая пользователем инициализация, присвоение и финализация очень подробно описаны в секции 7.6 Ada RM.
Controlled и Limited_Controlled особенно полезны для реализации типов, "размер" которых может варьироваться без ограничений (такие типы называют "неограниченными"). О них мы больше узнаем в следующих уроках, посвященных ссылочным типам.
К этому разделу упражнение отсутствует.
Вы можете перейти к следующему разделу.
Вернуться к предыдущему разделу | Вернуться к содержанию Урока 7 |
---|
David A. Wheeler (dwheeler@ida.org)
Исходная копия этого документа находится по адресу
"http://www.adahome.com/Tutorials/Lovelace/s7sf.htm".
Исходная копия перевода размещена на сайте http://www.ada-ru.org
Перевод: Юрий Королев
Общая редакция перевода: Г.Ю. Сисюк