【问题标题】:Inheritance of modules in OCamlOCaml中模块的继承
【发布时间】:2012-01-28 09:29:38
【问题描述】:

我已经定义了一个接口和一个模块:

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

【问题讨论】:

    标签: inheritance module ocaml


    【解决方案1】:

    您可以在签名和实现上使用include

    module type DERIVED = sig 
      include BASE
      val foo : ...
    end
    
    module Derived : DERIVED = struct
      include Base
      let foo = ...
    end
    

    这是一个简单的包含结构。它不是 OOP 意义上的“(实现)继承”,因为不涉及后期绑定(开放递归)。如果您在 Derived 中定义了一个值 f,而该值之前在 Base 中定义,它将覆盖之前的 f,但从 Base 调用 f 仍将使用旧值,而不是新值实施。

    【讨论】:

    • 感谢您的回答...我的第二个问题呢:“是否可以更改DERIVED的类型名称:例如,它被称为'a derived而不是@987654331 @"?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2016-06-24
    • 2014-01-02
    • 2020-06-27
    • 2018-02-25
    • 2012-09-02
    相关资源
    最近更新 更多