Ада-95. Компилятор GNAT

       

Общие сведения


Для того чтобы обеспечить сохранение абстракции, при автоматическом распределении и освобождении системных ресурсов, Ada95 предусматривает контролируемые типы.

Контролируемыми типами называют типы, производные от типа Controlled

или от лимитированного типа Limited_Controlled.

Оба этих типа описаны в стандартном пакете Ada.Finalization:

package Ada.Finalization is

pragma Preelaborate(Finalization);

type Controlled is abstract tagged null record;

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 null record;

procedure Initialize (Object : in out Limited_Controlled); procedure Finalize (Object : in out Limited_Controlled);

private

. . . -- стандартом не определено

end Ada.Finalization;

Основная идея использования объектов контролируемых и лимитированных контролируемых типов заключана в том, что вызов управляющих операций Initialize, Adjust и Finalize

осуществляется автоматически:

  • Initialize - "инициализация", вызывается сразу после создания объекта.

  • Finalize - "очистка", вызывается непосредственно перед разрушением объекта (включая переопределение содержимого объекта).

  • Adjust - осуществляет "подгонку" содержимого объекта после выполнения присваивания.

    Необходимо заметить, что объекты типа Controlled или Limited_Controlled

    не возможно использовать непосредственно, поскольку оба типа являются абстрактными.

    Вместо этого, для использования контролируемых объектов, необходимо описать тип, который будет производным от типа Controlled или от типа Limited_Controlled.

    Примечательным также является то, что предопределенные управляющие операции Initialize, Adjust и Finalize

    не являются абстрактными (они могут быть нормально унаследованы производным типом), однако, реализация этих предопределенных операций не выполняет никаких действий.

    Поэтому предполагается, что эти операции будут соответствующим образом переопределены для определяемого пользователем контролируемого типа, производного от типа Controlled или Limited_Controlled.




    Чтобы более наглядно продемонстрировать идею использования контролируемых типов, рассмотрим следующее:

    declare

    A: T; -- создание объекта A и вызов Initialize(A) B: T; -- создание объекта B и вызов Initialize(B) begin

    . . . A := B; -- вызов Finalize(A), копирование значения B в A и вызов Adjust(A) . . . end; -- вызов Finalize(A) и Finalize(B)

    В данном случае, предполагается, что тип T является производным от типа Controlled. Отличие использования типов, производных от типа Limited_Controlled, заключается только в отсутствии операции Adjust.

    При использовании объектов контролируемых типов, следует обратить внимание на то, что в случаях когда при описании объекта контролируемого типа указывается значение инициализации:

    . . .

    C: T := значение_инициализации; -- вызов Initialize(C) не выполняется!!!

    . . .

    то автоматический вызов операции Initialize выполняться не будет.


    Содержание раздела