Class 在OCaml类类型中建立继承和重写

Class 在OCaml类类型中建立继承和重写,class,inheritance,ocaml,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关键字,在:st

我试图编写类类型,但在表达我想要的内容时遇到了问题

我有

class type event_emitter = object
   method on : string -> unit
end
然后我想这样做:

class type socket = object
    inherit event_emitter
    method on : int -> unit
end
但是我得到了一个编译器错误,关于两者之间的类型签名不匹配。我也尝试过使用
virtual
关键字,在:string->unit上执行
class-type-virtual-event\u-emitter=method-virtual-on:string->unit>但这也不起作用,因为我猜这些是类类型定义,而不是实现


我真的希望这个方法重写能够工作,这看起来很简单,但不确定为什么它不被允许。

您试图做的是重载,而不是重写。您正在尝试在
socket
中创建一个与
event\u emitter
中同名但类型不同的新方法。重写将创建具有相同名称和类型的新方法。这个描述将适用于其他语言,如java和C++。不同之处在于,我不相信OCaml允许这种重载——与常规函数相同


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

您试图做的是重载,而不是重写。您正在尝试在
socket
中创建一个与
event\u emitter
中同名但类型不同的新方法。重写将创建具有相同名称和类型的新方法。这个描述将适用于其他语言,如java和C++。不同之处在于,我不相信OCaml允许这种重载——与常规函数相同


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

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

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

class type socket = object
    inherit [int] event_emitter
end

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

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

class type socket = object
    inherit [int] event_emitter
end

很好,我会试试这个。很好,我会试试这个。