在OCaml类类型中建立继承和覆盖

时间:2015-10-25 19:47:48

标签: class inheritance ocaml

我正在尝试编写类类型,并且有一个表达我想要的问题。

我有

class type event_emitter = object
   method on : string -> unit
end

然后我想这样做:

class type socket = object
    inherit event_emitter
    method on : int -> unit
end

但是我收到关于两者之间类型签名不匹配的编译器错误。我也尝试使用virtual关键字,执行class type virtual event_emitter = method virtual on : string -> unit,但这也不起作用,因为我猜这些是类类型定义,而不是实现。

我真的希望这种方法覆盖工作,这似乎很简单,不知道为什么不允许。

2 个答案:

答案 0 :(得分:2)

您要做的是重载,而不是覆盖。您正尝试在socket中创建一个与event_emitter中名称相同但具有不同类型的新方法。覆盖将创建具有相同名称和类型的新方法。此描述也适用于其他语言,如Java和C ++。不同之处在于我不相信OCaml允许这种重载 - 与常规函数相同。

请注意,如果您输入了类似的Java声明,它将起作用,但socket将有两个on方法,而不是一个。 OCaml不允许这样做。

答案 1 :(得分:2)

这与antron的答案并不矛盾,但你可以这样做:

class type ['a] event_emitter = object
   method on : 'a -> unit
end

class type socket = object
    inherit [int] event_emitter
end