conjugate: like Current is
... Все остальное - в точности, как раньше ...
Теперь в каждом порожденном классе тип результата
В классе
right: LINKABLE [G]
put_right (other: LINKABLE [G]) is...
замените
Эта схема применима ко многим процедурам
class DEVICE feature
alternate: like Current
set_alternate (a: like Current) is
-- Пусть a - альтернативное устройство.
do
alternate := a
end
... Прочие компоненты ...
end
Еще раз о базовых классах
С введением закрепленных типов нуждается в расширении понятие базового класса типа.
Сначала классы и типы были для нас едины, и это их свойство - отправной пункт ОО-метода, - по существу, сохраняется, хотя нам пришлось немного расширить систему типов, добавляя в классы родовые параметры. Каждый тип основан на классе и для типа определено понятие базового класса. Для типов, порожденных универсальным классом с заданными фактическими родовыми параметрами, базовым классом является универсальный класс, в котором удалены фактические параметры. Так, например, для
Закрепление типов - это еще одно расширение системы типов, которое, подобно двум предыдущим, сохраняет свойство выводимости каждого типа непосредственно из класса. Базовым для like anchor является базовый класс типа сущности
Правила о закрепленных типах
Теоретически ничто не мешает нам записать like anchor для самого элемента
Вначале закрепленные опорные элементы (anchored anchor) были запрещены, но это новое, более либеральное правило придает системе типов большую гибкость. |
Пусть
Обратное определение не симметрично: единственный тип, совместимый с like anchor, - это он сам. В частности, с ним не совместим тип
anchor, other: T; x: like anchor
...
create other
x := other -- предупреждение: ошибочное присваивание
то в порожденном классе, где
Будем говорить, что
При закреплении формального параметра или результата, как в случае
r (other: like Current)
фактический параметр вызова, например,
Когда не используются закрепленные объявления
Не всякое объявление вида