当前位置:  开发笔记 > 编程语言 > 正文

类和模块之间的区别

如何解决《类和模块之间的区别》经验,为你挑选了6个好方法。

我来自Java,现在我正在使用Ruby.

我不熟悉的一个语言功能是module.我想知道究竟是module什么,你什么时候使用一个,为什么要用module一个class



1> Sergii Shevc..:
???????????????????????????????????????????????????????????????????????????????
?               ? 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)          ?
???????????????????????????????????????????????????????????????????????????????


模块如何"不被实例化"并且还有实例方法?
我得到了层次结构,Class - > Module - > Object - > BasicObject.凉!!

2> scottru..:

第一个答案是好的并给出了一些结构性答案,但另一种方法是考虑你正在做什么.模块是关于提供可以在多个类中使用的方法 - 将它们视为"库"(正如您在Rails应用程序中看到的那样).类是关于对象的; 模块是关于功能的.

例如,身份验证和授权系统是模块的好例子.身份验证系统跨多个应用程序级别的类(用户进行身份验证,会话管理身份验证,许多其他类将根据身份验证状态采取不同的行为),因此身份验证系统充当共享API.

当您在多个应用程序之间共享方法时,您也可以使用模块(同样,库模型在这里很好).


@Caffeine并不是因为Ruby模块实际上包含实现,而Java中的接口是抽象的
不,模块和Java包/ JAR是完全不同的野兽.
我更像是带有方法实现的抽象类.
该模块是否与java中的Interfaces相同?
实际上,@ Chole打击了一个关于模块的好东西:命名空间.因此,虽然模块不是Java中的软件包的直接等价物,但它可以用来实现类似的东西:http://blog.rubybestpractices.com/posts/gregory/037-issue-8-uses-for-modules.html

3> 小智..:

我很惊讶有人还没说过这个.

由于提问者来自Java背景(我也是如此),这是一个有用的类比.

类就像Java类一样.

模块就像Java静态类.想想MathJava中的类.您没有实例化它,并且您重用静态类中的方法(例如Math.random()).


但是模块也可以向包含类添加实例方法,而Java中的静态类则不能.
这不完全正确; 模块没有静态方法,只有方法.模块可以"自我扩展"(语法实际上是"扩展自我"),使他们的方法可用于他们的`self`的元类.这使得可以在`Math`模块上调度类似`random()`的方法.但就其本质而言,模块的方法不能在模块自己的`self`上调用.这与Ruby的"self"概念,它的元类以及方法查找的工作原理有关.查看"Metaprogramming Ruby" - Paolo Perlotta了解详情.
来自繁重的C#背景也是如此.

4> hurcane..:

基本上,模块无法实例化.当一个类包含一个模块时,会生成一个代理超类,它提供对所有模块方法以及类方法的访问.

多个类可以包含一个模块.模块不能被继承,但这种"mixin"模型提供了一种有用的"多重继承"类型.OO纯粹主义者不同意这种说法,但不要让纯度妨碍完成工作.


(此答案最初链接到http://www.rubycentral.com/pickaxe/classes.html,但该链接及其域名不再有效.)



5> Boris Stitni..:

Module在Ruby中,在某种程度上,对应于Java 抽象类 - 具有实例方法,类可以从它继承(通过include,Ruby人称之为"mixin"),但没有实例.还有其他一些细微差别,但这些信息足以让您入门.



6> apadana..:

名称空间:模块是名称空间 ...在Java中不存在;)

我也从Java和python切换到了Ruby,我记得有完全相同的问题...

因此,最简单的答案是模块是名称空间,Java中不存在该名称空间。在Java中,最接近命名空间的是软件包

因此,ruby中的模块就像java:
class中的模块一样没有
界面?没有
抽象类?没有
包吗?也许吧)

Java类内部的静态方法:与ruby模块内部的方法相同

在Java中,最小单位是一个类,您不能在一个类之外有一个函数。但是在ruby中这是可能的(例如python)。

那么模块中包含什么呢?
类,方法,常量。模块在该名称空间下保护它们。

没有实例:模块不能用于创建实例

混合输入法:有时继承模型不适用于类,但在功能方面希望将一组类/方法/常量组合在一起

关于ruby中模块的规则:
-模块名称是UpperCamelCase-
模块中的常量是ALL CAPS(此规则对于所有ruby常量都是相同的,不特定于模块)
-访问方法:use。运算符
-访问常量:使用::符号

模块的简单示例:

module MySampleModule
  CONST1 = "some constant"

  def self.method_one(arg1)
    arg1 + 2
  end
end

如何在模块内使用方法:

puts MySampleModule.method_one(1) # prints: 3

如何使用模块常量:

puts MySampleModule::CONST1 # prints: some constant

关于模块的其他一些约定:
在文件中使用一个模块(例如ruby类,每个ruby文件一个类)

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有