Действительно, если функциям не разрешено возвращать значение привязанного типа или формального универсального типа.Причина заключается в семантике функции Once: ее тело выполняется только один раз (я опускаю более сложные случаи с рекурсией) независимо от текущего типа объекта.
В вашем примере это будетвозможно иметь потомка класса TERMINAL_COLOR
, скажем, TOUCH_PAD_COLOR
(что бы это ни значило):
class
TOUCH_PAD_COLOR
inherit
TERMINAL_COLOR
create
make
feature
touch_color: like Current
-- Color for visual indication of user interaction.
...
end
Давайте посмотрим, что происходит в следующем коде:
t: TERMINAL_COLOR
p: TOUCH_PAD_COLOR
...
t := {TERMINAL_COLOR}.black
p := {TOUCH_PAD_COLOR}.black
Поскольку black
возвращает like Current
, оба назначения действительны: тип black
равен TERMINAL_COLOR
в первом вызове и TOUCH_PAD_COLOR
- во втором.Однако тело функции black
выполняется только один раз, а именно при первом вызове.И тип вычисляемого объекта - TERMINAL_COLOR
.Во втором присваивании ранее вычисленный объект возвращается без выполнения тела функции black
.Тип объекта остается прежним: TERMINAL_COLOR
.Но теперь этот объект прикреплен к сущности p
типа TOUCH_PAD_COLOR
.Выполнение вызова p
, например, p.touch_color
, приведет к сбою, поскольку в классе TERMINAL_COLOR
нет метода touch_color
.
Что касается терминологии, то привязанные типы обозначают типы, объявленные в терминахнекоторые другие лица.Например, like Current
относится к типу текущего класса.
Отказ от ответственности. Существуют различные виды одноразовых функций, в приведенном выше сценарии рассматривается наиболее распространенный случай.