我正试图掌握OCaml语言语法,并且在应用一些OOP结构时遇到了一些麻烦。我在下面的代码中的目标是拥有一个继承自虚拟类foo的类栏。虚拟类包含三个虚拟方法,我希望将“播放器”对象的实例作为参数。当我编译下面的代码时,我得到错误:方法doThis类型'a - > 'b但是预计会有型球员。这意味着什么(记住,我是新手)以及如何纠正它?
谢谢!
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;;
答案 0 :(得分:2)
(我不知道OCaml,但我知道F#,他们是相似的,所以我希望我猜对了。)
尝试更改
method virtual doThis : player
method virtual doThat : player
method virtual notifyAll : player array
到
method virtual doThis : player -> unit
method virtual doThat : player -> unit
method virtual notifyAll : player array -> unit
答案 1 :(得分:1)
我认为之前的答案是正确的:有问题的方法需要将它们的类型作为返回单位的函数。
另一个更一般的建议:不要通过开始学习对象系统来开始学习OCaml。 OCaml中的对象可能很有用,但是您真正希望使用对象进行编程的情况很少见。在掌握核心语言之前,您将无法理解OCaml的对象系统。重点介绍如何使用基本代数数据类型(变体,元组,记录),普通参数多态(与您使用多态变体和对象看到的子类型相反)和模块(但不是仿函数)来解决问题。
在玩弄对象之前,先了解这些基本工具。使用其他语言的对象解决的大多数问题在没有它们的情况下在OCaml中得到最好的解决。