Ruby模块是否等同于Java接口?

时间:2009-02-22 22:07:27

标签: java ruby interface module

据我所知,接口是Java,旨在通过为实现接口的类布置方法来强制执行设计。这也是Ruby模块的想法吗?我发现就像使用Java中的Interfaces一样,你无法在Ruby中实例化模块。

5 个答案:

答案 0 :(得分:17)

简短的回答是否定的。

这就是推理,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

答案 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。