据我所知,接口是Java,旨在通过为实现接口的类布置方法来强制执行设计。这也是Ruby模块的想法吗?我发现就像使用Java中的Interfaces一样,你无法在Ruby中实例化模块。
答案 0 :(得分:17)
简短的回答是否定的。
这就是推理,Java / 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
答案 1 :(得分:7)
我认为我将模块等同于更类似于C#中的扩展方法。您正在向其他地方实际定义的现有类添加功能。在C#或Java中没有一个确切的模拟,但我绝对不会将它视为一个接口,因为实现是派生的,也是接口。
答案 2 :(得分:3)
没有。 ruby中的模块更类似于静态类。我不是Java开发人员,但我猜测 Java接口类似于C#接口,即他们定义合同,但不是实现。
我不应该这样,虽然我有红宝石的经验,但它是在视频游戏创作(RGSS / 2)。我确信我不知道经验丰富的红宝石程序员会知道很多事情。
答案 3 :(得分:3)
ruby中的模块是一些范围/命名空间,可以添加到其他内容中。它们用于两个截然不同但相关的目的:捆绑一堆属于一起的相关内容(常量,类等),然后将它们添加到其他范围(如多重继承)。
例如,有一些名为Comparable和Enumerable之类的模块,如果应用了这些形容词,它们会封装你期望得到的功能。通过提供基本定义(比较Comparable的两个实例和Enumerable的迭代器的方法),您可以导入模块并找到完整界面。
另一方面,像Net这样的模块很少包含在类中但提供了一系列功能,如Net :: HTTP,Net :: FTP,Net :: SMTP等。
中间有数学和过程之类的东西,可以用这种方式。
- MarkusQ
答案 4 :(得分:2)
从正式的角度来看Ruby实现设计中的模块 模式称为“mixin”。 http://en.wikipedia.org/wiki/Mixin
可以与PHP特征进行比较。 http://php.net/manual/en/language.oop5.traits.php
这种架构在不允许多重继承的语言中很有用,例如: Ruby,PHP。