Как я понимаю, интерфейс Java предназначен для обеспечения исполнения проекта, выставляя методы для классов, реализующих интерфейс для заполнения. Это тоже идея с модулем Ruby? Я вижу это так же, как с интерфейсами в Java, вы не можете создать экземпляр модуля в Ruby.
Является ли модуль Ruby эквивалентным интерфейсу Java?
Ответ 1
Я думаю, что я бы приравнял модуль к чему-то более близкому к методу расширения в С#. Вы добавляете функциональность к существующему классу, который определен в другом месте. Точного аналога в С# или Java нет, но я определенно не думал бы об этом как о интерфейсе, потому что реализация получена, а также интерфейс.
Ответ 2
Короткий ответ - нет.
Здесь аргументация, интерфейс Java/С# определяет сигнатуры методов, которые реализующий класс будет предоставлять как минимум.
Дополнительно:
- С рубиновыми модулями нет такого контракта из-за утиного ввода.
- Модули - это всего лишь способ извлечь общую функциональность для легкого повторного использования. Ближайшее отношение - это методы расширения С#, но они не являются точным совпадением, поскольку они существуют в статическом контексте.
- Модули могут добавлять состояние в существующий класс.
- Модули могут иметь статические методы
- Модули могут действовать как пространства имен
Пример:
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
Ответ 3
Нет. Модуль в рубине более похож на статический класс. Я не разработчик Java, но я предполагаю, что интерфейсы Java похожи на интерфейсы С#, т.е. Они определяют контракт, но не реализацию.
Я не должен этого делать, хотя у меня есть опыт работы в рубине, это в создании видеоигр (RGSS/2). Я уверен, что я не знаю многих вещей, о которых знал бы ветеран-рубиновый программист.
Ответ 4
Модуль в ruby - это немного пространства/пространства имен, которое можно добавить к другим вещам. Они используются для двух различных, но связанных целей: объединение связки связанных вещей (константы, классы и т.д.), Которые принадлежат друг другу, а затем добавление их в другую область (например, множественное наследование).
Например, существуют модули, называемые такими, как Comparable и Enumerable, и т.д., которые инкапсулируют функциональность, которую вы ожидаете, если бы эти прилагательные применялись. Предоставляя базовое определение (метод, который сравнивает два экземпляра для Comparable и итератор для Enumerable), вы можете импортировать модуль и найти себя с полным интерфейсом.
С другой стороны, существуют такие модули, как Net, которые вы бы редко включали в класс, но которые предоставляют набор функциональных возможностей, таких как Net:: HTTP, Net:: FTP, Net:: SMTP и т.д.
В середине есть такие вещи, как Math и Process, которые могут использоваться так или иначе.
- MarkusQ
Ответ 5
С формальной точки зрения модули в дизайне Ruby шаблон называется "mixin". http://en.wikipedia.org/wiki/Mixin
Его можно сравнить с особенностями PHP. http://php.net/manual/en/language.oop5.traits.php
Такая архитектура полезна в языках, которые не допускают множественного наследования, например. Ruby, PHP.