我可以从运行时选择的OCaml类继承吗?

时间:2015-02-19 17:31:28

标签: ocaml

所以现在我有两个相同类类型的类,例如

class foo : foo_type = object ... end

class bar : foo_type = object ... end

我希望在运行时有一个继承自foobar的第三个类。例如。 (伪语法)

class baz (some_parent_class : foo_type) = object
    inherit some_parent_class
    ...
end

这是否可以在OCaml中使用?

用例:我正在使用对象来构建AST访问者,我希望能够根据一组运行时标准组合这些访问者,这样他们只能对AST进行一次组合遍历。

编辑:我想我找到了一种使用一流模块创建所需类的方法:

class type visitor_type = object end

module type VMod = sig
  class visitor : visitor_type
end

let mk_visitor m =
  let module M = (val m : VMod) in
  (module struct
    class visitor = object
      inherit M.visitor
    end
  end : VMod)

然而,为了使它成为“一流”,必须在模块中包装一个类似乎有点迂回。如果有更简单的方法,请告诉我。

3 个答案:

答案 0 :(得分:4)

这只是你已经建议的更清晰的实现,但我会这样做:

module type Foo = sig
  class c : object
    method x : int
  end
end

module A = struct
  class c = object method x = 4 end
end

module B = struct
  class c = object method x = 5 end
end

let condition = true

module M = (val if condition then (module A) else (module B) : Foo)

class d = object (self)
  inherit M.c
  method y = self#x + 2
end

答案 1 :(得分:3)

与Jeffrey所说的不同,但您可以使用一流的模块实现这一目标。另外,我不确定你是否真的需要在运行时创建类,也许创建对象就足够了。如果你想得到的是不同的行为,那么这就足够了。

答案 2 :(得分:2)

OCaml有一个静态类型系统。你不能在运行时做任何会影响某事物类型的事情。继承会影响事物的类型,因此不能在运行时发生。

(您的代码也会将类型与值混淆,这是可以理解的。)

可能有一种方法可以接近您想要的,同时保留静态类型的理想属性。你真正需要的可能更像是功能构成。