У меня есть некоторый узел с объектами и классами. Я пытаюсь вызвать метод из класса kid в классе, чтобы добавить ребенка в семью в любое время, когда захочу, но я получаю сообщение об ошибке, которое я не понимаю.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»]).
Я экспериментировал, но я не мог объединить строки со списком, получив ожидаемую ошибку (строка * строка) * string.
Спасибо за Вас время :)
Я обновил ответ. – ivg
это работает, спасибо. Как насчет последней части, когда я печатаю семью, как я могу напечатать 2 конкатенированные строки + список детей после этого, не делая этого дважды? – minus
Прежде всего, вы не печатаете, а конвертируете в строку. Это другое. Чтобы преобразовать строковый список в строку, вы можете использовать 'String.concat', который также принимает разделитель. Кроме того, использование 'sprintf' (или любой другой функции printf-family) очень полезно. – ivg