15

OCaml 中的 Module 和 Class 有什么区别。

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

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

首先,我不明白“模块不支持动态查找”是什么意思。在我看来,抽象和多态确实意味着父指针可以引用子实例。那是“动态查找”吗?如果不是,那么动态查找的实际含义是什么?

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

4

2 回答 2

13

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

模块基本上只是一个“抽屉”,您可以在其中放置类型、函数、其他模块等......它只是在这里订购您的代码。然而,多亏了函子,这个抽屉真的很强大。

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

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

于 2013-07-16T17:32:59.877 回答
9

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

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

因此,当您想调用它时,方法的查找是在运行时(也称为动态)完成的list#pop

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

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

我想让描述变得实用,因为您似乎对 OCaml 很陌生。

希望它可以帮助你。

于 2013-07-16T22:04:16.127 回答