5
說,我有一個類A
和一個模塊B
。我想將B
包含/擴展爲A
,但將包含/擴展方法標記爲私有(所以它們將不會被A
的調用者訪問,但可在A
的方法內訪問)。我可以包含/擴展模塊,但將所有包含/擴展方法標記爲私有?
如何將B
納入A
但將所有包含的方法標記爲私有?
說,我有一個類A
和一個模塊B
。我想將B
包含/擴展爲A
,但將包含/擴展方法標記爲私有(所以它們將不會被A
的調用者訪問,但可在A
的方法內訪問)。我可以包含/擴展模塊,但將所有包含/擴展方法標記爲私有?
如何將B
納入A
但將所有包含的方法標記爲私有?
包括然後明確地使所有包含的方法是私有的?
class A
include B
private *B.instance_methods
extend B
class << self
private *B.instance_methods
end
end
可以猴補丁Module
添加private_include
和private_extend
:
class Module
def private_include *modules
class_eval do
self.send(:include, *modules)
modules.each do |mod|
self.send(:private, *mod.instance_methods)
end
end
end
def private_extend *modules
singleton = class << self; self end
singleton.instance_eval do
self.send(:include, *modules)
modules.each do |mod|
self.send(:private, *mod.instance_methods)
end
end
end
end
這是一個非常好的monkeypatch來回答這個問題。布拉沃。 – ghayes 2013-07-14 21:23:06
也許這是一份工作更適合代表團/組成,而不是繼承? – 2013-03-26 18:17:47
@RonDahlgren您能否詳細說明或提供或鏈接到您的建議? – 2013-03-26 18:21:38
委託是涉及保存B(委託)的內部實例的設計模式。您想要公開的方法應該被寫爲A的方法,其中實現只是調用(「委託」)到B的內部實例。組合是一種不太具體的委託形式,其中特定的行爲是通過「合成'不同班級的實例。維基百科:http://en.wikipedia.org/wiki/Delegation_pattern和http://en.wikipedia.org/wiki/Object_composition – 2013-03-26 18:41:20