【问题标题】:Module and Class in OCamlOCaml 中的模块和类
【发布时间】:2013-07-16 16:16:38
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: ocaml


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

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

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 2014-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多