Модуль Ruby эквивалентен интерфейсу Java? - PullRequest
20 голосов
/ 23 февраля 2009

Насколько я понимаю, интерфейс на языке Java предназначен для реализации проекта путем размещения методов для классов, реализующих интерфейс для заполнения. Является ли эта идея также модулем Ruby? Я вижу, что, как и в случае с интерфейсами в Java, вы не можете создать экземпляр модуля в Ruby.

Ответы [ 5 ]

17 голосов
/ 26 февраля 2009

Короткий ответ - нет.

Вот рассуждение, интерфейс Java / C # определяет сигнатуры методов, которые реализующий класс предоставит как минимум.

Дополнительно:

  • С модулями ruby ​​такого контракта нет из-за утки.
  • Модули - это всего лишь способ извлечь общие функциональные возможности для легкого повторного использования. Наиболее близким отношением являются методы расширения C #, но они не являются точным соответствием, поскольку они существуют в статическом контексте.
  • Модули могут добавлять состояние в существующий класс.
  • Модули могут иметь статические методы
  • Модули могут действовать как пространства имен

Пример:

module SimpleConversation
  class NamespacedExample
    def poke
      puts "ouch"
    end
  end

  attr_accessor :partner_name
  def converse
    partner_name ||= "Slowpoke"
    speak + "\n#{partner_name}: Yes they are"
  end

  def self.yay
    puts "yay"
  end
end

class Foo
  include SimpleConversation
  attr_accessor :name

  def speak
    name ||= "Speedy"
    "#{name}: tacos are yummy"
  end
end

x = Foo.new
x.name = "Joe"
x.partner_name = "Max"
puts x.speak
puts x.converse

y = SimpleConversation::NamespacedExample.new
y.poke

SimpleConversation.yay
7 голосов
/ 23 февраля 2009

Я думаю, что я бы приравнял модуль к чему-то более похожему на метод расширения в C #. Вы добавляете функциональность в существующий класс, который фактически определен в другом месте. Точного аналога нет ни в C #, ни в Java, но я бы определенно не думал об этом как об интерфейсе, потому что реализация получена так же как и интерфейс.

3 голосов
/ 26 февраля 2009

Модуль в ruby ​​- это область видимости / пространства имен, которую можно добавить к другим вещам. Они используются для двух разных, но связанных целей: связать кучу связанных вещей (констант, классов и т. Д.), Которые принадлежат друг другу, и затем добавить их в другую область (например, множественное наследование).

Например, есть модули, называемые такими вещами, как Comparable и Enumerable и т. Д., Которые инкапсулируют функциональность, которую вы ожидаете получить, применяя эти прилагательные. Предоставляя базовое определение (метод, который сравнивает два экземпляра для Comparable и итератор для Enumerable), вы можете импортировать модуль и найти себя с полным интерфейсом.

С другой стороны, есть такие модули, как Net, которые вы редко включаете в класс, но которые предоставляют набор функций, таких как Net :: HTTP, Net :: FTP, Net :: SMTP и т. Д.

Посередине находятся такие вещи, как математика и процесс, которые можно использовать так или иначе.

- MarkusQ

3 голосов
/ 23 февраля 2009

Нет. Модуль в ruby ​​больше похож на статический класс. Я не Java-разработчик, но я предполагаю , что интерфейсы Java похожи на интерфейсы C #, то есть они определяют контракт, но не реализацию.

Я не должен этого делать, хотя у меня есть опыт работы с ruby, он занимается созданием видеоигр (RGSS / 2). Я уверен, что не знаю многих вещей, которые знал бы ветеран рубинового программиста.

2 голосов
/ 06 мая 2012

С формальной точки зрения модули в Ruby реализуют дизайн шаблон называется "миксин". http://en.wikipedia.org/wiki/Mixin

Это можно сравнить с чертами PHP. http://php.net/manual/en/language.oop5.traits.php

Такая архитектура полезна в языках, которые не допускают множественное наследование, например Ruby, PHP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...