Языки программирования - концепции и принципы

Однако каждое обтъявление процедуры, показанное


Однако каждое обтъявление процедуры, показанное внизу рисунка, имеет фор­мальный параметр конкретного типа. Как показано стрелками, вызов должен быть отправлен в соответствии с типом фактического параметра.

    Обратите внимание, что диспетчеризация выполняется только в случае необ­ходимости; если компилятор может разрешить вызов статически, он так и сде­лает. Следующие вызовы не нуждаются ни в какой диспетчеризации, потому что вызов делается с фактическим параметром конкретного типа, а не типа класса:

Set_Speed(A, 500);

Set_Speed(S, 1000);

Точно так же, если формальный параметр имеет тип класса, то никакая диспет­черизация не нужна. Вызовы Ргос — это вызовы отдельной однозначной про-





цедуры; формальный параметр имеет тип класса, который соответствует фак­тическому параметру любого типа, относящегося к классу. Что касается рис. 14.7, то, если бы объявление Set_Speed было задано как:

procedure Set_Speed(A: in out Airplane'Class: I: in Integer);

то любой фактический параметр класса «вписался» бы в формальный пара­метр класса. Никакая диспетчеризация не нужна, потому что каждый раз вы­зывается одна и та же подпрограмма.

    При ссылочном доступе указуемый объект так же может иметь CW-тип. Ука­затель при этом может указывать на любой объект, тип которого покрывается CW-типом, и диспетчеризация осуществляется просто раскрытием указателя:

type Class_Ptr is access Airplane_Data'Class;

Ptr: Class_Ptr := new Airplane_Data;

if (...) then Ptr := new SST_Data; end if;

Set_Speed(Ptr.all);                                              -- На какой именно тип указывает Ptr??

Динамический полиморфизм в языке Ada 95 имеет место, когда фактиче­ский параметр относится к CW-типу, а формальный параметр относится к конкретному типу.

 

Реализации диспетчеризации во время выполнения в языках Ada 95 и C++ похожи, тогда как условия для диспетчеризации совершенно разные:


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