虚拟类的继承 - 第二个对象类型没有方法x

时间:2017-05-31 06:11:41

标签: 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

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 时出现?

2 个答案:

答案 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