Разница между классом и модулем

Я пришел с Java, и теперь я больше работаю с Ruby.

Одна из особенностей языка, с которой я не знаком, - это module. Мне интересно, что такое module и когда вы его используете, и зачем использовать module поверх class?

Ответ 1

Первый ответ хорош и дает некоторые структурные ответы, но другой подход - подумать о том, что вы делаете. Модули касаются предоставления методов, которые вы можете использовать в нескольких классах - подумайте о них как о "библиотеках" (как вы видели в приложении Rails). Классы посвящены объектам; модули относятся к функциям.

Например, системы аутентификации и авторизации являются хорошими примерами модулей. Системы аутентификации работают на нескольких классах приложений (пользователи проходят аутентификацию, сеансы управляют аутентификацией, многие другие классы будут действовать по-разному на основе состояния auth), поэтому системы аутентификации действуют как общие API-интерфейсы.

Вы также можете использовать модуль, если у вас есть общие методы для нескольких приложений (опять же, модель библиотеки здесь хороша).

Ответ 2

╔═══════════════╦═══════════════════════════╦═════════════════════════════════╗
║               ║ 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)          ║
╚═══════════════╩═══════════════════════════╩═════════════════════════════════╝

Ответ 3

Я удивлен, что кто-то еще этого не сказал.

Так как искатель пришел с фона Java (и так сделал я), здесь есть аналогия, которая помогает.

Классы просто похожи на классы Java.

Модули похожи на статические классы Java. Подумайте о классе Math в Java. Вы не создаете экземпляр, и вы повторно используете методы в статическом классе (например, Math.random()).

Ответ 4

В принципе, модуль не может быть создан. Когда класс включает модуль, создается прокси-суперкласс, который обеспечивает доступ ко всем методам модуля, а также к методам класса.

Модуль может быть включен несколькими классами. Модули не могут быть унаследованы, но эта модель "mixin" обеспечивает полезный тип "множественного наследования". Пуристы OO не согласятся с этим утверждением, но не допускают, чтобы чистота мешала выполнению этой работы.


(Этот ответ первоначально был связан с http://www.rubycentral.com/pickaxe/classes.html, но эта ссылка и ее домен больше не активны.)

Ответ 5

Module в Ruby в какой-то степени соответствует абстрактному классу Java - имеет методы экземпляра, классы могут наследовать от него (через include, ребята Ruby называют это "mixin" ), но не имеют экземпляров. Существуют и другие незначительные отличия, но этой информации достаточно, чтобы вы начали.

Ответ 6

источник (вы можете узнать характеристики модуля оттуда)

Модуль представляет собой набор методов и констант. Методы в модуле могут быть методами экземпляра или модульными методами. Методы экземпляров отображаются как методы в классе при включении модуля, а методы модуля - нет. И наоборот, модульные методы могут быть вызваны без создания инкапсулирующего объекта, в то время как методы экземпляра могут отсутствовать.

Ответ 7

Нижняя строка: модуль является перекрестком между классом static/utility и mixin.

Микшины являются многоразовыми фрагментами "частичной" реализации, которые могут быть объединены (или составлены) в сочетании и соответствуют моде, чтобы помочь создавать новые классы. Конечно, эти классы могут иметь собственное состояние и/или код.

Ответ 8

Класс

Когда вы определяете класс, вы определяете схему для типа данных.  данные удержания класса, имеют метод, который взаимодействует с этими данными и используется для создания объектов.

Модуль

  • Модули - это способ группировки методов, классов и констант.

  • Модули дают вам два основных преимущества:

    = > Модули предоставляют пространство имен и предотвращают конфликты имен. Пространство имен помогает избежать конфликтов с функциями и классами с тем же именем, которые были написаны кем-то другим.

    = > Модули реализуют средство mixin.

(в том числе модуль в Klazz дает примеры доступа Klazz к модулю методы. )

(расширяйте Klazz с Mod, предоставляя классу Klazz доступ к методам Mods.)