2014-09-05 96 views
4

考虑以下小OCaml的类层次结构:类方法可见细化

class x = object method i = 0 end ;; 
class y = object method x = new x end ;; 
class x2 = object method i = 0 method j = 1 end ;; 
class z = object method x = new x2 inherit y end;; (* type error *) 

我想实现的是细化领域class z w.r.t.的xclass y并有细化可见在z的类型,即

class z = object method x = (new x2 :> x) inherit y end;; 
(new z)#x#j;; (* type error *) 

我想达到的目标。

我相当有信心,有一种方法来说服细化的兼容性的类型检查,但如何?

回答

3

它看起来是很难直接做到这一点:如果你试图使用一种类型的参数,以放松的method x类型的y

class ['a] y = object 
    constraint 'a = #x 
    method x = new x 
end 

,你可以看到类型检查力量'a恰好x#xx的不属于任何亚型:

class ['a] y = object 
    constraint 'a = x 
    method x = new x 
end 

这将因此precl ude任何企图用另一种类型重新定义method x。但是,它可以定义一个期望#x类型的对象作为参数的类,并从中导出原始class yclass z

class x = object method i = 0 end ;; 

class ['a] y_gen (x:'a) = object 
    constraint 'a = #x 
    method x = x end 
;; 

class y = object inherit [x] y_gen (new x) end 

class x2 = object method i = 0 method j = 1 end ;; 

class ['a] z_gen (x:'a) = object 
    constraint 'a = #x2 
    inherit ['a] y_gen x 
    method! x = x 
end;; 

class z = object inherit [x2] z_gen (new x2) end 

此外,z的确是y一个亚型,即,以下是正确类型检查:

let my_z = new z 
let my_y = (my_z :> y)