Diferencia entre una clase y un módulo

Resuelto Josh Moore asked hace 16 años • 9 respuestas

Vengo de Java y ahora trabajo más con Ruby.

Una característica del idioma con la que no estoy familiarizado es module. Me pregunto qué es exactamente a moduley cuándo se usa uno, y por qué usar a moduleen lugar de a class.

Josh Moore avatar Sep 30 '08 09:09 Josh Moore
Aceptado
╔═══════════════╦═══════════════════════════╦═════════════════════════════════╗
║               ║ 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)          ║
╚═══════════════╩═══════════════════════════╩═════════════════════════════════╝
Sergii Shevchyk avatar Mar 19 '2012 21:03 Sergii Shevchyk

La primera respuesta es buena y ofrece algunas respuestas estructurales, pero otro enfoque es pensar en lo que estás haciendo. Los módulos tratan de proporcionar métodos que puede usar en múltiples clases; considérelos como "bibliotecas" (como vería en una aplicación Rails). Las clases tratan sobre objetos; Los módulos tratan sobre funciones.

Por ejemplo, los sistemas de autenticación y autorización son buenos ejemplos de módulos. Los sistemas de autenticación funcionan en múltiples clases a nivel de aplicación (los usuarios se autentican, las sesiones administran la autenticación, muchas otras clases actuarán de manera diferente según el estado de autenticación), por lo que los sistemas de autenticación actúan como API compartidas.

También puede usar un módulo cuando haya compartido métodos entre varias aplicaciones (nuevamente, el modelo de biblioteca es bueno aquí).

scottru avatar Sep 30 '2008 04:09 scottru

Me sorprende que nadie haya dicho esto todavía.

Dado que el autor de la pregunta tenía experiencia en Java (y yo también), aquí hay una analogía que ayuda.

Las clases son simplemente como clases de Java.

Los módulos son como clases estáticas de Java. Piensa en Mathlas clases en Java. No crea una instancia y reutiliza los métodos en la clase estática (por ejemplo Math.random()).

Linan avatar Aug 08 '2013 19:08 Linan

Básicamente, no se puede crear una instancia del módulo. Cuando una clase incluye un módulo, se genera una superclase proxy que proporciona acceso a todos los métodos del módulo, así como a los métodos de la clase.

Un módulo puede estar incluido en varias clases. Los módulos no se pueden heredar, pero este modelo "mixin" proporciona un tipo útil de "herencia múltiple". Los puristas de OO no estarán de acuerdo con esa afirmación, pero no permitan que la pureza se interponga en la realización del trabajo.


(Esta respuesta originalmente estaba vinculada a http://www.rubycentral.com/pickaxe/classes.html, pero ese vínculo y su dominio ya no están activos).

hurcane avatar Sep 30 '2008 02:09 hurcane