2015-05-28 114 views
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」])。

我一直在試驗這個,但我不能將字符串與列表合併,得到期望的錯誤(字符串*字符串)*字符串。

謝謝你的時間:)

回答

1

類中所有值的類型都應該綁定到它的定義。例如:

# 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 ['a] ident x = object 
    method x : 'a = x 
    end;; 
class ['a] ident : 'a -> object method x : 'a end 

在你的情況下,manwomankid是未綁定的。因爲,每次你定義創建一個名爲同樣類型的類,你可以將它們綁定到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;; 
+0

我已經更新了答案。 – ivg

+0

工作,謝謝。當我打印這個家庭的最後一部分時,我怎麼能打印出兩個concatinated字符串+之後的孩子列表,而不必重複兩次? – minus

+0

首先你不打印,但轉換爲字符串。那不一樣。爲了將字符串列表轉換爲字符串,可以使用'String.concat',它也接受分隔符。另外,使用'sprintf'(或任何其他printf-family'函數是非常有用的。 – ivg

相關問題