當類在Ruby中都繼承了單類也繼承:爲什麼Ruby模塊包含排除模塊的單例類?
class A
def self.hello
puts "hello"
end
end
class B < A
end
B.hello #=> "hello"
然而,隨着模塊,這種情況並非如此:
module M
def self.goodbye
puts "goodbye"
end
end
class A
include M
end
A.goodbye #=> NameError
爲了避開這一限制多脂肪酶求助於這個醜陋破解:
module M
def self.included(c)
c.extend ClassMethods
end
module ClassMethods
def goodbye
puts "goodbye"
end
end
end
好吧,所以我的問題:是否有一個理論/概念原因背後的這種限制的模塊?還是僅僅是一個執行困難?我看過C源代碼(YARV/MRI)後可以確定是否存在執行困難(不是無法克服,但完全相同),但這是唯一原因嗎?這種限制是否有其他原因?
謝謝
他們爲什麼要工作?包含模塊與繼承類不是一回事。 – 2010-10-03 15:36:39
@Mladen,我不買這個。如果概念上的區別非常明確,那麼爲什麼人們(即使是非常頂級的Ruby程序員)都試圖通過使用'ClassMethods'破解來繞過這個限制?此外 - 爲什麼它如此愚蠢,以某種方式模塊的本質意味着這個特殊的限制。 – horseyguy 2010-10-03 19:35:32
恕我直言,模塊mixins!=多重繼承,所以無論有人可能做什麼都不能證明任何東西。順便說一下,你能否通過一個真實世界的例子來說明黑客攻擊的必要性,例如,通過包含模塊「A」並通過模塊「B」擴展,無法達到相同目的? – 2010-10-04 13:27:40