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

Замещая унаследованное определение присваивания, вы


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

Динамический полиморфизм получаем как непосредственное следствие. Возьмем

A.Set_Speed(250);

Компилятор не имеет никакой возможности узнать, является конкретный тип значения, находящегося в данный момент в А, базовым типом Air-plane_Data для А или некоторым типом, порожденным из Airplane_Data. Так как подпрог­рамма Set_Speed была переопределена, по крайней мере, в одном порожден­ном классе, должна выполняться диспетчеризация во время выполнения. Об­ратите внимание, что не требуется никакого специального синтаксиса или се­мантики: все вызовы потенциально динамические, хотя компилятор проведет оптимизацию и использует статическое связывание, где это возможно.

 

 

Абстрактные классы

Абстрактные классы в языке Eiffel такие же, как в языках C++ и Ada 95. Класс или свойство в классе может быть объявлено как отсроченное (deferred). Отсроченный класс должен быть сделан конкретным при помощи эффективизации (effecting) всех отсроченных свойств, т. е. предоставления ре­ализации. Обратите внимание, что, в отличие от языков C++ и Ada 95, вы мо­жете объявить объект, чей тип отсрочен; вы получаете null-указатель, который не может использоваться до тех пор, пока ему не будет присвоено значение имеющего силу производного типа:

deferred class Set...                             -- Абстрактный класс

class Bit_Set inherit Set...                   -- Конкретный класс

S: Set;                                                  -- Абстрактный объект!

В: Bit_Set;                                            - Конкретный объект

!!B;                                                       --Создать экземпляр В

S := В;                                               -- Правильно,S получает конкретный объект,

S.Union(...);                                       --который теперь можно использовать

 

 

 


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