类方法可见细化
问题描述:
考虑以下小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.的x
class y
并有细化可见在z的类型,即
class z = object method x = (new x2 :> x) inherit y end;;
(new z)#x#j;; (* type error *)
是不我想达到的目标。
我相当有信心,有一种方法来说服细化的兼容性的类型检查,但如何?
答
它看起来是很难直接做到这一点:如果你试图使用一种类型的参数,以放松的method x
类型的y
,
class ['a] y = object
constraint 'a = #x
method x = new x
end
,你可以看到类型检查力量'a
是恰好x
和#x
x
的不属于任何亚型:
class ['a] y = object
constraint 'a = x
method x = new x
end
这将因此precl ude任何企图用另一种类型重新定义method x
。但是,它可以定义一个期望#x
类型的对象作为参数的类,并从中导出原始class y
和class 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)