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



Модель механизма диспетчеризации - часть 2


Далее, по выбранной таблице, осуществляется косвенный вызов подпрограммы, для которой индекс в таблице соответствует требуемой примитивной операции.

Для лучшей демонстрации этой идеологии, предположим теперь, что мы решили описать новый тип Grand_Child_1_1, производный от типа Child_1, следующим образом:

with Simple_Objects; use Simple_Objects;

package Simple_Objects_New is

type Grand_Child_1_1 is new Child_1 with null record;

procedure New_Method (Self: in Grand_Child_1_1); procedure New_Method_Call (Self: in Grand_Child_1_1'Class); . . .

end Simple_Objects_New;

Дополнительно предположим, что далее в пакете Simple_Objects_New описываются типы, производные от типа Grand_Child_1_1, и то, что реализация надклассовой процедуры New_Method_Call выполняет диспетчеризуемый вызов процедуры New_Method.

Тогда, в этом описании содержится два примечательных факта:

  • Мы сознательно не определили для типа Grand_Child_1_1

    реализацию функции The_Name. Следовательно, она будет унаследована от типа Child_1

  • Описание типа Grand_Child_1_1 определяет новую примитивную диспетчеризуемую операцию - процедуру New_Method.

    Согласно нашей модели, вид тэга для типа Grand_Child_1_1 будет следующий:

    -------------- Grand_Child_1_1'Tag ---> | The_Name |---> The_Name для Child_1 -------------- | New_Method |---> New_Method для Grand_Child_1_1 --------------

    Из данной иллюстрация видно, что поскольку тип Grand_Child_1_1

    не имеет собственной реализации функции The_Name, то таблица диспетчеризации, которая соответствует его тэгу, содержит указатель на реализацию функции The_Name

    для его предка, типа Child_1.

    Таким образом, вызов процедуры Show, для типа Grand_Child_1_1, осуществит вызов унаследованной от типа Child_1 реализации функции The_Name

    (в соответствии с индексом в таблице диспетчеризации).

    Примечательно также, что описание новой примитивной операции (процедура New_Method) обусловило появление нового элемента в таблице диспетчеризации для типа Grand_Child_1_1.




    Содержание  Назад  Вперед