Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby模块等同于Java接口吗?_Java_Ruby_Interface_Module - Fatal编程技术网

Ruby模块等同于Java接口吗?

Ruby模块等同于Java接口吗?,java,ruby,interface,module,Java,Ruby,Interface,Module,据我所知,接口是Java的目的是通过为实现接口的类设置方法来实施设计。这也是Ruby模块的想法吗?我看到,就像Java中的接口一样,您不能在Ruby中实例化模块。不。Ruby中的模块更类似于静态类。我不是Java开发人员,但我猜Java接口类似于C#接口,也就是说,它们定义的是契约,而不是实现 我不应该这么说,虽然我在ruby方面有经验,但它是在视频游戏创作(RGSS/2)方面。我确信我不知道一个经验丰富的ruby程序员会知道的很多事情。我认为我应该将模块等同于更类似于C#中的扩展方法。您正在向

据我所知,接口是Java的目的是通过为实现接口的类设置方法来实施设计。这也是Ruby模块的想法吗?我看到,就像Java中的接口一样,您不能在Ruby中实例化模块。

不。Ruby中的模块更类似于静态类。我不是Java开发人员,但我猜Java接口类似于C#接口,也就是说,它们定义的是契约,而不是实现


我不应该这么说,虽然我在ruby方面有经验,但它是在视频游戏创作(RGSS/2)方面。我确信我不知道一个经验丰富的ruby程序员会知道的很多事情。

我认为我应该将模块等同于更类似于C#中的扩展方法。您正在向其他地方实际定义的现有类添加功能。在C#或Java中都没有精确的模拟,但我绝对不会将其视为接口,因为实现是派生的,接口也是派生的。

ruby中的模块是一个可以添加到其他东西中的范围/名称空间。它们用于两个不同但相关的目的:将一组相关的东西(常量、类等)捆绑在一起,然后将它们添加到其他范围(如多重继承)

例如,有一些称为Comparable和Enumerable等的模块,它们封装了如果应用这些形容词,您将期望具有的功能。通过提供一个基本定义(一个比较两个可比较实例和一个迭代器可枚举实例的方法),您可以导入模块,并找到完整的接口

另一方面,有些像Net这样的模块很少包含在类中,但它们提供了一系列功能,如Net::HTTP、Net::FTP、Net::SMTP等

在中间有一些东西,比如数学和过程,它们可能会以某种方式使用


--MarkusQ

简单的答案是否定的

原因是,Java/C接口定义了实现类至少提供的方法签名

此外:

  • 对于ruby模块,由于duck类型,没有这样的契约
  • 模块只是一种提取通用功能以便于重用的方法。最接近的关系是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

从形式的角度看Ruby实现设计中的模块 模式称为“mixin”。

它可以与PHP特性相比较。


这种体系结构在不允许多重继承的语言中很有用,例如Ruby、PHP。

为了我自己的利益,我的评估错了吗?这就是我到目前为止一直在使用它们的方式,也许我遗漏了一些东西。你可以在Ruby类中包含一个模块,并继承它的行为,至少是实例方法。看看这是真的,我确实知道,我只是很少在rpg maker中使用它。谢谢,我现在明白了。因此,如果
ruby
模块
Java
静态类
,那么
ruby
模块像
C#
命名空间