OCaml中的模块和类

时间:2013-07-16 16:16:38

标签: ocaml

OCaml中模块和类之间有什么区别。

从我的搜索中,我发现了这个:

  

两者都提供了抽象和封装的机制   子类型(通过省略对象中的方法,并省略字段中的字段)   模块),以及继承(对象使用继承;模块使用   包括)。但是,这两个系统没有可比性。   一方面,对象具有优势:对象是一流的   值,模块不是 - 换句话说,模块不支持   动态查找。另一方面,模块有一个优点:模块   可以包含类型定义,而对象则不能。

首先,我不明白“模块不支持动态查找”是什么意思。从我的角度来看,抽象和多态意味着父指针可以引用子实例。这是“动态查找”吗?如果没有,实际上动态查找意味着什么?

实际上,我们什么时候选择使用Module和Class?

2 个答案:

答案 0 :(得分:13)

Module和Class之间的主要区别在于您没有实例化模块。

模块基本上只是一个“抽屉”,您可以在其中放置类型,功能,其他模块等...它只是在这里订购您的代码。然而,由于仿函数,这个抽屉非常强大。

另一方面,存在要实例化的类。它们包含变量和方法。您可以从类创建对象,每个对象都包含自己的变量和方法(如类中所定义)。

在实践中,大多数情况下使用模块将是一个很好的解决方案。当您需要继承(例如小部件)时,类可能很有用。

答案 1 :(得分:9)

从实际角度来看,动态查找让您使用相同的方法拥有不同的对象,而无需指定它所属的类/模块。它在使用继承时可以帮助您。

例如,让我们使用两个数据结构:SingleListDoubleLinkedList,它们都从List继承并拥有方法pop。每个类都有自己的方法实现(因为'覆盖')。

因此,当您想要调用它时,在执行list#pop时,方法的查找将在运行时完成(a.k.a。动态)。

如果您使用的是模块,则必须使用SingleList.pop listDoubleLinkedList.pop list

编辑:正如@ Majestic12所说,大多数时候,OCaml用户倾向于使用模块而不是类。当他们需要继承或实例时使用第二个(检查他的答案)。

我想让描述变得实用,因为你似乎对OCaml不熟悉。

希望它可以帮到你。