繁体   English   中英

埃菲尔铁塔(Eiffel):对形式通用参数的无效约束

[英]Eiffel: Invalid constraint for formal generic paramete

跟随一些奇怪的图案,我不能这样做吗? 编译器说Invalid constraint for formal generic parameter

class PARENT[G -> CHILD[like Current]]

feature -- Access

    children: LIST[G]

end

class CHILD[H -> PARENT[like Current]]

feature -- Access

    father: H
end

能够做类似的事情

class WIDOW_PARENT

inherit
    PARENT[BLACK_CHILD]

end

class BLACK_CHILD

inherit 
    CHILD[WIDOW_PARENT]

end

如果我不采用通用性,则必须重新定义

  • children: LIST[CHILD] children: LIST[BLACK_CHILD]进入WIDOW_PARENT类
  • father: PARENT father: WIDOW_PARENT进入BLACK_CHILD类

而不是只在继承子句中指定它...希望有道理

更新资料

当我用Alexanders答案解决它时,我被困在进一步进行一致性检查的过程中。 我试图根据实体设置HTTP路由器,并且如果它是子实体,它应该能够执行http:// host:port / entity / child_entity / id从实体获取所有子实体。 为此,我想向通用路由器添加检查。 在诸如ANY_PARENT_DB_ENTITY类的东西上

if ({G}).conforms_to ({CHILD_DB_ENTITY[ANY_PARENT_DB_ENTITY]}) then
    friend.act_like_a_father 
else
    friend.act_like_a_mate
end

在当代的埃菲尔铁塔中,锚定类型不能用于形式上的泛型约束,因此会产生错误。 通过显式地重复类类型,仍然可能存在相互约束:

class PARENT [G -> CHILD [PARENT [G]]]
class CHILD  [H -> PARENT [CHILD [H]]]

通过此更改,示例得以编译。

仍然是我的最佳解决方案,整个模式的唯一解决方案是在路由器类中使用以下set_handler重新定义set_handler方法:

CHILD_DB_EN​​TITY

deferred class
    CHILD_DB_ENTITY[H -> PARENT_DB_ENTITY[CHILD_DB_ENTITY[H]]]

inherit
    DB_ENTITY

feature 

    parent: H

ENTITY_HANDLER

ENTITY_HANDLER[G -> DB_ENTITY, H -> DB_SERVICE[G] create make end]

feature

        item_prototype: detachable G

        set_handler
            do
                setting_url_("http://host:port/" + {like item_prototype}.out)
                ...
            end
end -- Class

CHILD_ENTITY_HANDLER

CHILD_ENTITY_HANDLER[G -> CHILD_DB_ENTITY[PARENT_DB_ENTITY[G]], H -> DB_SERVICE[G]]

inherit
    ENTITY_HANDLDER
        redefine
            set_handler
        end

feature

        set_handler
            do
                Precursor
                setting_url_("http://host:port/" + ({like item_prototype}).out + "/" + ({like item_prototype.parent}).out + "/{id}")
            end

end -- Class

PARENT_ENTITY_HANDLER

PARENT_ENTITY_HANDLER[G -> PARENT_DB_ENTITY[CHILD_DB_ENTITY[G]], H -> DB_SERVICE[G]]

inherit
    ENTITY_HANDLDER
        redefine
            set_handler
        end

feature

        set_handler
            do
                Precursor
                setting_url_("http://host:port/" + ({like item_prototype}).out + "/" + ({like item_prototype.children.item}).out + "/{id}")
                -- children being a LINKED_LIST[PARENT_DB_ENTITY]
            end

end -- Class

我希望有一种方法可以在同一个类中实现多态,但是必须以这种方式重新定义它也很有意义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM