据我所知,接口是Java旨在通过为实现接口填充的类布置方法来强制执行设计.这也是Ruby模块的想法吗?我看到,就像Java中的Interfaces一样,你无法在Ruby中实例化一个模块.
最简洁的答案是不.
这就是推理,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
我认为我将模块等同于类似于C#中的扩展方法.您正在向其他地方实际定义的现有类添加功能.在C#或Java中没有一个确切的模拟,但我绝对不会将它视为一个接口,因为实现是派生的以及接口.