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

2022-09-02 03:41:30

据我所知,接口是Java旨在通过为实现要填充的接口的类设置方法来强制执行设计。这也是 Ruby 模块的想法吗?我看到就像Java中的接口一样,你不能在Ruby中实例化模块。


答案 1

简短的答案是否定的。

下面是推理,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

答案 2

我想我会把一个模块等同于更类似于C#中的扩展方法。您正在向实际在其他地方定义的现有类添加功能。在C#或Java中没有确切的模拟,但我绝对不会将其视为接口,因为实现和接口一样派生。


推荐