类和模块之间的区别
我来自Java,现在我更多地使用Ruby。
我不熟悉的一种语言function是module
。 我想知道什么是一个module
,什么时候使用一个,为什么在一个class
使用一个module
?
第一个答案很好,给出了一些结构性答案,但另一种方法是思考你在做什么。 模块是关于提供可以跨多个类使用的方法 – 将它们想象成“库”(就像在Rails应用程序中看到的那样)。 类是关于对象的; 模块是关于function。
例如,authentication和授权系统就是模块的好例子。 身份validation系统可以跨多个应用程序级别(用户进行身份validation,会话pipe理身份validation,许多其他类将根据身份validation状态采取不同的操作),因此身份validation系统充当共享API。
当你在多个应用程序中共享方法时,你也可以使用一个模块(同样,这里的库模型也很好)。
╔═══════════════╦═══════════════════════════╦═════════════════════════════════╗ ║ ║ class ║ module ║ ╠═══════════════╬═══════════════════════════╬═════════════════════════════════╣ ║ instantiation ║ can be instantiated ║ can *not* be instantiated ║ ╟───────────────╫───────────────────────────╫─────────────────────────────────╢ ║ usage ║ object creation ║ mixin facility. provide ║ ║ ║ ║ a namespace. ║ ╟───────────────╫───────────────────────────╫─────────────────────────────────╢ ║ superclass ║ module ║ object ║ ╟───────────────╫───────────────────────────╫─────────────────────────────────╢ ║ methods ║ class methods and ║ module methods and ║ ║ ║ instance methods ║ instance methods ║ ╟───────────────╫───────────────────────────╫─────────────────────────────────╢ ║ inheritance ║ inherits behaviour and can║ No inheritance ║ ║ ║ be base for inheritance ║ ║ ╟───────────────╫───────────────────────────╫─────────────────────────────────╢ ║ inclusion ║ cannot be included ║ can be included in classes and ║ ║ ║ ║ modules by using the include ║ ║ ║ ║ command (includes all ║ ║ ║ ║ instance methods as instance ║ ║ ║ ║ methods in a class/module) ║ ╟───────────────╫───────────────────────────╫─────────────────────────────────╢ ║ extension ║ can not extend with ║ module can extend instance by ║ ║ ║ extend command ║ using extend command (extends ║ ║ ║ (only with inheritance) ║ given instance with singleton ║ ║ ║ ║ methods from module) ║ ╚═══════════════╩═══════════════════════════╩═════════════════════════════════╝
我很惊讶有人还没有这样说。
由于提问者来自Java背景(我也是如此),这里有一个比较有用的比喻。
类就像Java类一样。
模块就像Java静态类。 在Java中考虑Math
课。 您不要实例化它,而是重用静态类中的方法(例如Math.random()
)。
基本上,模块不能被实例化。 当一个类包含一个模块时,会生成一个代理超类,它提供对所有模块方法以及类方法的访问。
一个模块可以包含多个类。 模块不能被inheritance,但是这个“mixin”模型提供了一个有用的“多重inheritance”types。 面向对象的纯粹主义者会不同意这种说法,但不要让纯粹性妨碍完成工作。
(这个答案最初链接到http://www.rubycentral.com/pickaxe/classes.html
,但该链接和它的域名不再有效。)
Ruby中的Module
在一定程度上对应于Java 抽象类 – 具有实例方法,类可以inheritance它(通过include
,Ruby家伙称之为“mixin”),但没有实例。 还有其他的细微差别,但是这些信息足以让你开始。
源 (你可以从那里了解模块的特性)
模块是方法和常量的集合。 模块中的方法可以是实例方法或模块方法。 当包含模块时,实例方法在类中显示为方法,而模块方法则不会。 相反,可以调用模块方法而不创build封装对象,而实例方法可能不会。
底线:模块是一个静态/实用程序类和mixin之间的交叉点。
Mixins是可重复使用的“部分”实现,可以以混合和匹配的方式组合(或合成),以帮助编写新的类。 当然,这些类还可以有自己的状态和/或代码。
类
当你定义一个类时,你定义了一个数据types的蓝图。 类拥有数据,有方法与数据交互,并用于实例化对象。
模
-
模块是将方法,类和常量组合在一起的一种方法。
-
模块给你两个主要好处:
=>模块提供一个名称空间并防止名称冲突。 命名空间有助于避免与其他人写过的名称相同的函数和类发生冲突。
=>模块实现混合工具。
(包括Klazz中的Module给出了Klazz访问Module方法的实例。)
(用Mod扩展Klazz,让Klazz类访问Mods方法。)