[英]Is a Ruby module equivalent to a Java Interface?
據我所知,接口是Java旨在通過為實現接口填充的類布置方法來強制執行設計。這也是Ruby模塊的想法嗎? 我看到,就像Java中的Interfaces一樣,你無法在Ruby中實例化一個模塊。
最簡潔的答案是不。
這就是推理,Java / 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.