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


Двойная диспетчеризация - часть 2


Однако, внутри процедуры, значение Output_Device'Class

приведет к осуществлению диспетчеризации в случае вызова примитивной операции для типа Output_Device.

Подобный прием называют двойной диспетчеризацией.

Например, предположим, что тип Output_Device имеет следующую примитивную операцию:

procedure Write_Output (D : in Output_Device; S : in String);

В этом случае, тип Message_Child_Type, производный от типа Message_Type, может переопределить реализацию процедуры Put приблизительно следующим образом:

procedure Put (M : in Message_Child_Type; D : in Output_Device'Class) is begin

Put (Message_Type(M), D); -- вызов версии Put предка . . . Write_Output (D, ... ); -- отображение данных сообщения . . . end Put;

Вызов процедуры Put, осуществленный с вовлечением параметра надклассового типа, который соответствует типу Message_Child_Type, и параметром с определенным типом устройства вывода приведет к вызову показанной выше версии процедуры Put.

Это приведет к тому, что отображение данных сообщения будет осуществлено с помощью процедуры Write_Output, реализация которой будет выбрана в результате диспетчеризации.




- Начало -  - Назад -  - Вперед -



Книжный магазин