我已经定义了一个接口和一个模块:
module type BASE =
sig
type 'a base
val ...
...
end
module base =
(struct
type 'a base
let ...
...
end: BASE)
我想定义从DERIVED
继承的另一个接口BASE
,其中包含BASE
的所有类型和签名,并且有自己的类型和声明。然后我可以定义另一个类型为Derived
的模块DERIVED
。
有人能告诉我怎么做吗?它是否必然是OCaml的对象特征?
更进一步,是否可以更改DERIVED
类型的名称:例如,它被称为'a derived
而不是“a base
?
答案 0 :(得分:5)
您可以在签名和实现上使用include
。
module type DERIVED = sig
include BASE
val foo : ...
end
module Derived : DERIVED = struct
include Base
let foo = ...
end
这是一个简单的结构包含。它不是OOP意义上的“(实现)继承”,因为没有涉及后期绑定(开放递归)。如果您在f
中定义之前在Derived
中定义的值Base
,则会影响之前的f
,但会从{{1}调用f
仍将使用旧值,而不是新实现。