Ocaml 如何从另一个 class 调用一个 class 中的方法

Ocaml how to call a method in one class from another class

我在 objects 和 class 方面遇到了一些麻烦。我正在尝试调用 class 家庭中的 class 孩子的方法,以便随时在家庭中添加一个孩子,但我收到一个我不太明白的错误。

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,我想在男人和女人的名字后面添加孩子的名字列表,让它看起来像这样:

我一直在试验这个,但我无法将字符串与列表合并,得到预期的错误 (string*string)*string。

感谢您的宝贵时间:)

class 中所有值的类型都应与其定义绑定。例如:

# class ident x = object
    method x = x
  end;;
    Characters 6-11:
  class ident x = object
        ^^^^^
Error: Some type variables are unbound in this type:
         class ident : 'a -> object method x : 'a end
       The method x has type 'a where 'a is unbound

这意味着,您需要将其绑定到具体类型:

class ident x = object
    method x : int = x
  end;;
class ident : int -> object method x : int end

或者使您的 class 多态并将值绑定到新引入的类型变量:

# class ['a] ident x = object
    method x : 'a = x
  end;;
class ['a] ident : 'a -> object method x : 'a end

在您的情况下,manwomankid 未绑定。因为,每次定义 class 时都会创建同名类型,您可以将它们绑定到 manwomanchild(并修复方法中的拼写错误)

class family familyName man woman =
    object
        val man : man  = man
        val woman : woman = woman
        val mutable kids = ([] :string list)
        initializer woman#changeLastName (man#printLastName)
        method addKid (kid : child) = kids <- (kid#printLastName)::kids
        method printFamily = (man#printNameAndLastName ^ ", " ^ woman#printNameAndLastName)
end;;