OCaml中的模块和类

15
在OCaml中,模块(Module)和类(Class)有哪些区别?
通过我的搜索,我发现以下内容:
两者都提供了抽象和封装的机制,支持子类型(通过省略对象方法或模块字段)和继承(对象使用inherit; 模块使用include)。然而,这两个系统不可比较。一方面,对象具有优势:对象是一等值,而模块不是——换句话说,模块不支持动态查找。另一方面,模块具有优势:模块可以包含类型定义,而对象则不能。
首先,我不理解“模块不支持动态查找”是什么意思。在我的理解中,抽象和多态确实意味着父指针可以引用子实例。这是否就是“动态查找”?如果不是,那么动态查找实际上是什么?
在实践中,我们何时选择使用模块,何时选择使用类?
2个回答

13

模块和类的主要区别在于,您不需要实例化一个模块。

模块基本上只是一个“抽屉”,您可以在其中放置类型、函数、其他模块等等。它只是用来组织您的代码的。由于functor的强大,这个抽屉非常强大。

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

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


9
从实际角度来看,动态查找使您可以拥有具有相同方法的不同对象,而无需指定它属于哪个类/模块。在使用继承时,它可以帮助您。
例如,让我们使用两个数据结构:SingleListDoubleLinkedList,它们都从List继承并具有pop方法。每个类都有自己的方法实现(因为'override')。
因此,当您想要调用它时,方法的查找是在运行时进行的(也称为动态),当您执行list#pop时。
如果您正在使用模块,则必须使用SingleList.pop listDoubleLinkedList.pop list编辑:正如@Majestic12所说,大多数情况下,OCaml用户倾向于使用模块而不是类。当他们需要继承或实例时使用第二种方法(请参阅他的答案)。
我希望这个描述能对您有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接