Раздел 7.7 - Контролируемые пользователем инициализация, финализация и присваивание

Манипуляции с объектами основываются на трех видах действий: инициализации (initialization), финализации (finalization) и присваивании (assignment). Инициализация переменной происходит, когда программа ``выполняет'' соответствующее описание переменной. Финализация происходит, когда переменная ``уничтожается'' (например, когда происходит возврат из подпрограммы, в которой эта переменная была описана).

Эти операции присутствуют в 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 особенно полезны для реализации типов, "размер" которых может варьироваться без ограничений (такие типы называют "неограниченными"). О них мы больше узнаем в следующих уроках, посвященных ссылочным типам.


К этому разделу упражнение отсутствует.

Вы можете перейти к следующему разделу.


Вы можете также:

PREVIOUS Вернуться к предыдущему разделу

OUTLINE  Вернуться к содержанию Урока 7

David A. Wheeler (dwheeler@ida.org)

Перевод: Юрий Королев   Общая редакция перевода: Г.Ю. Сисюк

Исходная копия этого документа находится по адресу "http://www.adahome.com/Tutorials/Lovelace/s7sf.htm".

Исходная копия перевода размещена на сайте http://www.ada-ru.org