Oop 用于将自定义对象作为参数传入的OCaml语法
我试图掌握OCaml语言语法,但在应用一些OOP结构时遇到了一些问题。下面代码的目标是拥有一个从虚拟类foo继承的类栏。虚拟类包含三个虚拟方法,我希望将“player”对象的实例作为参数。当我编译下面的代码时,我得到了一个错误:方法doThis的类型为'a->'b,但预期的类型为player。这意味着什么(记住,我是新手),我该如何着手纠正它 谢谢Oop 用于将自定义对象作为参数传入的OCaml语法,oop,syntax,ocaml,Oop,Syntax,Ocaml,我试图掌握OCaml语言语法,但在应用一些OOP结构时遇到了一些问题。下面代码的目标是拥有一个从虚拟类foo继承的类栏。虚拟类包含三个虚拟方法,我希望将“player”对象的实例作为参数。当我编译下面的代码时,我得到了一个错误:方法doThis的类型为'a->'b,但预期的类型为player。这意味着什么(记住,我是新手),我该如何着手纠正它 谢谢 class player = object end;; class virtual foo = object (self) method vi
class player =
object
end;;
class virtual foo =
object (self)
method virtual doThis : player
method virtual doThat : player
method virtual notifyAll : player array
end;;
class bar (playersIn: player array) =
object (self)
inherit foo
method doThis (p:player) = Printf.printf "%s\n" "This!"
method doThat (p:player) = Printf.printf "%s\n" "That!"
method notifyAll (p:player array) = Printf.printf "%s\n" "Notifying!"
end;;
(我不知道OCaml,但我知道F#,它们很相似,所以希望我猜对了。)
试着改变
method virtual doThis : player
method virtual doThat : player
method virtual notifyAll : player array
到
我相信前面的答案是正确的:所讨论的方法需要它们的类型是返回单元的函数 另一条更一般的建议是:不要从学习对象系统开始学习OCaml。OCaml中的对象可能很有用,但真正想使用对象编程的情况很少。在掌握好核心语言之前,您将无法理解OCaml的对象系统。重点介绍如何使用基本代数数据类型(变量、元组、记录)、普通参数多态性(与多态变量和对象的子类型相反)和模块(但不是函子)解决问题
在使用对象之前,先了解这些基本工具。使用其他语言的对象可以解决的大多数问题在没有它们的OCaml中都能得到最好的解决。在这种情况下,听起来像是您最初将它们定义为“值”或“属性”,而->单元使其具有函数类型(将播放器作为参数,不返回结果)。
method virtual doThis : player -> unit
method virtual doThat : player -> unit
method virtual notifyAll : player array -> unit