OCaml中的模块和类

问题描述 投票:14回答:2

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

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

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

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

实际上,我们什么时候选择使用模块,何时选择类?

ocaml
2个回答
9
投票

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

例如,让我们使用两个数据结构:SingleListDoubleLinkedList,它们都继承自List并具有方法pop。每个类都有自己的方法实现(由于'override')。

因此,当您要调用它时,当您执行list#pop时,将在运行时(也称为动态)对方法进行查找。

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

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

我想使描述更实际,因为您似乎对OCaml陌生。

希望它可以帮助您。


13
投票

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

一个模块基本上只是一个“抽屉”,您可以在其中放置类型,函数,其他模块等。这里就是订购代码的地方。但是,由于有函子,这个抽屉确实功能强大。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.