0
我對對象和類有一些精力。我試圖從班級家庭的班級孩子那裏調用一種方法,隨時隨地在家庭中添加一個孩子,但是我得到一個我不明白的錯誤。Ocaml如何從另一個類中調用一個類中的方法
class virtual person name lastName sex =
object
val name = (name:string)
val mutable lastName = (lastName:string)
val sex = (sex:char)
end;;
class man name lastName=
object
inherit person name lastName 'm'
method printNameAndLastName = (name^" "^lastName)
method changeLastName newLastName = lastName <- newLastName
method printLastName = lastName
end;;
class woman name lastName =
object
inherit person name lastName 'w'
method printNameAndLastName = (name^" "^lastName)
method changeLastName newLastName = lastName <- newLastName
method printLastName = lastName
end;;
class child name sex=
object
inherit person name "" 'm'
method printNameAndLastName = (name^" "^lastName)
method changeLastName newLastName = lastName <- newLastName
method printLastName = lastName
end;;
class family familyName man woman=
object
val man = man
val woman = woman
val mutable kids = ([] :string list)
initializer woman#changeLastName (man#printLastName)
method addKid kid = kids <- (kid#printLastName)::kids
method printFamily = (man#printNameAndLastNAme^", "^woman#printNameAndLastName)
end;;
Error: Some type variables are unbound in this type:
class family :
'a ->
(< printLastName : 'c; printNameAndLastNAme : string; .. > as 'b) ->
(< changeLastName : 'c -> unit; printNameAndLastName : string;
.. >
as 'd) ->
object
val mutable kids : string list
val man : 'b
val woman : 'd
method addKid : < printLastName : string; .. > -> unit
method printFamily : string
end
The method addKid has type
(< printLastName : string; .. > as 'e) -> unit
where 'e is unbound
當我添加方法addKid時發生錯誤。也是最後的方法printFamily,我想男人和女人的名字後,以增加它的孩子名字的列表,使得它看起來是這樣的:
- (字符串*字符串)*字符串列表=( (「男人」,「女人」),[「kid1」; 「kid2」])。
我一直在試驗這個,但我不能將字符串與列表合併,得到期望的錯誤(字符串*字符串)*字符串。
謝謝你的時間:)
我已經更新了答案。 – ivg
工作,謝謝。當我打印這個家庭的最後一部分時,我怎麼能打印出兩個concatinated字符串+之後的孩子列表,而不必重複兩次? – minus
首先你不打印,但轉換爲字符串。那不一樣。爲了將字符串列表轉換爲字符串,可以使用'String.concat',它也接受分隔符。另外,使用'sprintf'(或任何其他printf-family'函數是非常有用的。 – ivg