OCaml中模块和类之间有什么区别。
从我的搜索中,我发现了这个:
两者都提供了抽象和封装的机制 子类型(通过省略对象中的方法,并省略字段中的字段) 模块),以及继承(对象使用继承;模块使用 包括)。但是,这两个系统没有可比性。 一方面,对象具有优势:对象是一流的 值,模块不是 - 换句话说,模块不支持 动态查找。另一方面,模块有一个优点:模块 可以包含类型定义,而对象则不能。
首先,我不明白“模块不支持动态查找”是什么意思。从我的角度来看,抽象和多态意味着父指针可以引用子实例。这是“动态查找”吗?如果没有,实际上动态查找意味着什么?
实际上,我们什么时候选择使用Module和Class?
答案 0 :(得分:13)
Module和Class之间的主要区别在于您没有实例化模块。
模块基本上只是一个“抽屉”,您可以在其中放置类型,功能,其他模块等...它只是在这里订购您的代码。然而,由于仿函数,这个抽屉非常强大。
另一方面,存在要实例化的类。它们包含变量和方法。您可以从类创建对象,每个对象都包含自己的变量和方法(如类中所定义)。
在实践中,大多数情况下使用模块将是一个很好的解决方案。当您需要继承(例如小部件)时,类可能很有用。
答案 1 :(得分:9)
从实际角度来看,动态查找让您使用相同的方法拥有不同的对象,而无需指定它所属的类/模块。它在使用继承时可以帮助您。
例如,让我们使用两个数据结构:SingleList
和DoubleLinkedList
,它们都从List
继承并拥有方法pop
。每个类都有自己的方法实现(因为'覆盖')。
因此,当您想要调用它时,在执行list#pop
时,方法的查找将在运行时完成(a.k.a。动态)。
如果您使用的是模块,则必须使用SingleList.pop list
或DoubleLinkedList.pop list
。
编辑:正如@ Majestic12所说,大多数时候,OCaml用户倾向于使用模块而不是类。当他们需要继承或实例时使用第二个(检查他的答案)。
我想让描述变得实用,因为你似乎对OCaml不熟悉。
希望它可以帮到你。