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_PARENTclass
father: PARENT
到father: WIDOW_PARENT
变成BLACK_CHILDclass
而不是只在继承子句中指定它...希望它有意义
更新
当我用 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
在当代的 Eiffel 中,锚定类型不能用于正式的泛型约束,因此会出现错误。仍然可以通过显式重复 class 类型来实现相互约束:
class PARENT [G -> CHILD [PARENT [G]]]
class CHILD [H -> PARENT [CHILD [H]]]
通过此更改,示例可以编译。
对我来说仍然是最好的解决方案,我的整个模式的唯一解决方案是在我的路由器 class 中重新定义 set_handler
方法
CHILD_DB_ENTITY
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
孩子_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
父母_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
我希望有一种方法可以在同一个 class 中使用多态性,但必须以这种方式重新定义它也是有意义的...
跟随一些奇怪的模式,我不能这样做吗?编译器说 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_PARENTclassfather: PARENT
到father: WIDOW_PARENT
变成BLACK_CHILDclass
而不是只在继承子句中指定它...希望它有意义
更新
当我用 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
在当代的 Eiffel 中,锚定类型不能用于正式的泛型约束,因此会出现错误。仍然可以通过显式重复 class 类型来实现相互约束:
class PARENT [G -> CHILD [PARENT [G]]]
class CHILD [H -> PARENT [CHILD [H]]]
通过此更改,示例可以编译。
对我来说仍然是最好的解决方案,我的整个模式的唯一解决方案是在我的路由器 class 中重新定义 set_handler
方法
CHILD_DB_ENTITY
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
孩子_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
父母_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
我希望有一种方法可以在同一个 class 中使用多态性,但必须以这种方式重新定义它也是有意义的...