Привязка типов может использоваться в следующих случаях:
feature
f (i: INDEXABLE [G, H])
local
y: like i.lower
do
y := i.lower
end
Иногда обобщенный тип c не используется в качестве возвращаемого типа любой доступной функции в классе, поэтому в этих случаях я хотел бы объявить фиктивная особенность, специально предназначенная для привязки:
class SOME_CLASS [G]
feature
generic_type_anchor: G
do
check
for_anchoring_only: False
-- This method should never actually be called, only used as an anchor in type declarations
end
end
Это особенно полезно для сложных деревьев наследования или когда классы-потомки закрывают универсальные шаблоны, и в этом случае правильный тип не очевиден из объявленного типа. Лично я склонен использовать привязку типов всякий раз, когда значения семантически связаны, так как это помогает выразить намерение, упрощает рефакторинг (так как существует меньше повторений типов, которые по определению должны совпадать) и облегчает ковариацию.
Также в качестве сопутствующего примечания расширенные типы (например, INTEGER
) нельзя использовать полиморфно (для этого вам нужна ссылка; если класс A расширен и класс B [расширенный или ссылочный] наследует A, вы не можете присвоить значение типа B переменной тип A; наследование от расширенных типов неявно не соответствует), и, кроме того, компилятор запрещает наследование от базовых c расширенных типов (INTEGER
, BOOLEAN
, REAL_64
, et c.), поэтому Ограничение c в вашем примере не имеет смысла, потому что H
никогда не может быть ничем, кроме INTEGER
.