与通用 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]。因此,lowerINTEGER 类型,而不是 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 类型的变量;从扩展类型继承是隐式不符合要求的),而且编译器不允许从基本扩展类型继承(INTEGERBOOLEANREAL_64 等),因此您的示例中的通用约束没有意义,因为 H 只能是 INTEGER.