簡體   English   中英

Ruby模塊是否等同於Java接口?

[英]Is a Ruby module equivalent to a Java Interface?

據我所知,接口是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中沒有一個確切的模擬,但我絕對不會將它視為一個接口,因為實現是派生的以及接口。

不,ruby中的模塊更類似於靜態類。 我不是Java開發人員,但我猜測 Java接口類似於C#接口,即他們定義合同,但不是實現。

我不應該這樣,雖然我有紅寶石的經驗,但它是在視頻游戲創作(RGSS / 2)。 我確信我對一位經驗豐富的紅寶石程序員會知道很多事情一無所知。

ruby中的模塊是一個可以添加到其他東西的范圍/命名空間。 它們用於兩個截然不同但相關的目的:捆綁一組屬於一起的相關內容(常量,類等),然后將它們添加到其他范圍(如多重繼承)。

例如,有一些模塊稱為Comparable和Enumerable等,如果應用了這些形容詞,它們將封裝您期望具有的功能。 通過提供基本定義(比較Comparable的兩個實例和Enumerable的迭代器的方法),您可以導入模塊並使用完整的界面找到自己。

另一方面,像Net這樣的模塊很少包含在類中,但它提供了一系列功能,如Net :: HTTP,Net :: FTP,Net :: SMTP等。

在中間有數學和過程之類的東西,可以用這種或那種方式。

- MarkusQ

從形式上看,Ruby中的模塊實現了設計模式“mixin”。 http://en.wikipedia.org/wiki/Mixin

它可以與PHP特征進行比較。 http://php.net/manual/en/language.oop5.traits.php

這種架構在不允許多重繼承的語言中很有用,例如Ruby,PHP。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM