по выбранной таблице, осуществляется косвенный
Далее, по выбранной таблице, осуществляется косвенный вызов подпрограммы, для которой индекс в таблице соответствует требуемой примитивной операции.
Для лучшей демонстрации этой идеологии, предположим теперь, что мы решили описать новый тип 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.
Содержание Назад Вперед