我有一个虚拟超类和一个继承它的子类。以下是我的情况的一个简单示例:
class virtual super = object(self)
method virtual virtualSuperMethod : super
end;;
class sub = object(self)
inherit super
method subMethod y =
y+2;
method virtualSuperMethod =
let newSub = new sub in
newSub
end;;
然而,当我尝试编译时,我得到以下错误:
Error: The expression "new sub" has type sub but is used with type super
The second object type has no method subMethod
当我删除 subMethod 时,此错误消失。
正如您所看到的,错误消息表明其中一个问题是我返回了一个子类型。我不明白为什么这是一个问题,因为sub继承了super。为什么它只在我添加 subMethod 时出现?
答案 0 :(得分:1)
只有在添加方法子方法时才会出现错误,因为它会生成 class sub是类super的子类,而在OCaml中,对象强制必须是显式的:
method virtualSuperMethod =
let newSub = new sub in
(newSub :> super)
这可以解决您的问题。
您可以查看https://realworldocaml.org/v1/en/html/objects.html了解详情。
答案 1 :(得分:1)
OCaml在类型之间没有隐式强制 - 你必须插入一个明确的强制,如下所示:
class virtual super = object (self)
method virtual virtualSuperMethod : super
end
class sub = object (self)
inherit super
method subMethod y = y + 2
method virtualSuperMethod =
let newSub = new sub in
(newSub :> super)
end