与通用 class 共享类型?
Sharing a type with a generic class?
如何将变量声明为与用于实例化泛型的类型参数相同的类型 class?以下代码无法编译:
class
TEST [G, H -> INTEGER]
feature
f (i: INDEXABLE [G, H])
local
y: H
do
y := i.lower -- Type error here.
end
end
编译器说赋值源与目标不兼容。
在当前的实现中,INDEXABLE [G, H]
继承自 TABLE [G, INTEGER]
。因此,lower
是 INTEGER
类型,而不是 H
。而INTEGER
不符合classTEST
的形式泛型H
。这解释了错误。
对我来说,class INDEXABLE
的声明看起来像是一个错误。它应该继承自 TABLE [G, H]
而不是。然后,示例代码将编译。
在这些情况下可以使用类型锚定:
feature
f (i: INDEXABLE [G, H])
local
y: like i.lower
do
y := i.lower
end
有时泛型类型不用作 class 上任何可访问功能的 return 类型,因此在这些情况下,我喜欢声明一个专门允许锚定的假功能:
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
这对于复杂的继承树或当后代 classes 关闭泛型时特别有用,在这种情况下,正确的类型从声明的类型中看不出来。就我个人而言,只要值在语义上相关,我就倾向于使用类型锚定,因为这有助于表达意图、简化重构(因为根据定义必须匹配的类型重复次数较少)并促进协变。
另外作为旁注,扩展类型(如 INTEGER
)不能多态使用(你需要一个参考;如果 class A 被扩展并且 class B [expanded or reference] 继承 A,不能将 B 类型的值赋给 A 类型的变量;从扩展类型继承是隐式不符合要求的),而且编译器不允许从基本扩展类型继承(INTEGER
、BOOLEAN
、REAL_64
等),因此您的示例中的通用约束没有意义,因为 H
只能是 INTEGER
.
如何将变量声明为与用于实例化泛型的类型参数相同的类型 class?以下代码无法编译:
class
TEST [G, H -> INTEGER]
feature
f (i: INDEXABLE [G, H])
local
y: H
do
y := i.lower -- Type error here.
end
end
编译器说赋值源与目标不兼容。
在当前的实现中,INDEXABLE [G, H]
继承自 TABLE [G, INTEGER]
。因此,lower
是 INTEGER
类型,而不是 H
。而INTEGER
不符合classTEST
的形式泛型H
。这解释了错误。
对我来说,class INDEXABLE
的声明看起来像是一个错误。它应该继承自 TABLE [G, H]
而不是。然后,示例代码将编译。
在这些情况下可以使用类型锚定:
feature
f (i: INDEXABLE [G, H])
local
y: like i.lower
do
y := i.lower
end
有时泛型类型不用作 class 上任何可访问功能的 return 类型,因此在这些情况下,我喜欢声明一个专门允许锚定的假功能:
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
这对于复杂的继承树或当后代 classes 关闭泛型时特别有用,在这种情况下,正确的类型从声明的类型中看不出来。就我个人而言,只要值在语义上相关,我就倾向于使用类型锚定,因为这有助于表达意图、简化重构(因为根据定义必须匹配的类型重复次数较少)并促进协变。
另外作为旁注,扩展类型(如 INTEGER
)不能多态使用(你需要一个参考;如果 class A 被扩展并且 class B [expanded or reference] 继承 A,不能将 B 类型的值赋给 A 类型的变量;从扩展类型继承是隐式不符合要求的),而且编译器不允许从基本扩展类型继承(INTEGER
、BOOLEAN
、REAL_64
等),因此您的示例中的通用约束没有意义,因为 H
只能是 INTEGER
.