class - 类方法的可见细化

标签 class inheritance ocaml redeclaration

考虑以下小的 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 *)

我要实现的是细化领域xclass z w.r.t. 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而不是任何子类型 #xx :
class ['a] y = object
  constraint 'a = x
  method x = new x
end

因此,这将排除任何重新定义 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)

关于class - 类方法的可见细化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25683317/

相关文章:

ios - 将 INT 值从一个场景传递到另一个场景

php - 在面向对象编程中,哪个对象应该维护多对多关系? (如果有的话)

javascript - 在 React Native 中将 const 转换为类?

scala - Haskell、Scala、Clojure,如何选择高性能模式匹配和并发

syntax - "Variable ... must occur on both sides of this | pattern"

javascript - 什么是 JavaScript 中的原型(prototype)?

javascript - 构造函数的继承属性

c# - 装饰者模式与继承的例子

typescript 在静态方法中获取类型

arrays - Ocaml中带有参数的类型的数组