所以现在我有两个相同类类型的类,例如
class foo : foo_type = object ... end
class bar : foo_type = object ... end
我希望在运行时有一个继承自foo
或bar
的第三个类。例如。 (伪语法)
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)
然而,为了使它成为“一流”,必须在模块中包装一个类似乎有点迂回。如果有更简单的方法,请告诉我。
答案 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有一个静态类型系统。你不能在运行时做任何会影响某事物类型的事情。继承会影响事物的类型,因此不能在运行时发生。
(您的代码也会将类型与值混淆,这是可以理解的。)
可能有一种方法可以接近您想要的,同时保留静态类型的理想属性。你真正需要的可能更像是功能构成。