2013-03-26 80 views
5

說,我有一個類A和一個模塊B。我想將B包含/擴展爲A,但將包含/擴展方法標記爲私有(所以它們將不會被A的調用者訪問,但可在A的方法內訪問)。我可以包含/擴展模塊,但將所有包含/擴展方法標記爲私有?

如何將B納入A但將所有包含的方法標記爲私有?

+1

也許這是一份工作更適合代表團/組成,而不是繼承? – 2013-03-26 18:17:47

+0

@RonDahlgren您能否詳細說明或提供或鏈接到您的建議? – 2013-03-26 18:21:38

+0

委託是涉及保存B(委託)的內部實例的設計模式。您想要公開的方法應該被寫爲A的方法,其中實現只是調用(「委託」)到B的內部實例。組合是一種不太具體的委託形式,其中特定的行爲是通過「合成'不同班級的實例。維基百科:http://en.wikipedia.org/wiki/Delegation_pattern和http://en.wikipedia.org/wiki/Object_composition – 2013-03-26 18:41:20

回答

6

包括然後明確地使所有包含的方法是私有的?

class A 
    include B 
    private *B.instance_methods 
    extend B 
    class << self 
    private *B.instance_methods 
    end 
end 

可以猴補丁Module添加private_includeprivate_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 
+1

這是一個非常好的monkeypatch來回答這個問題。布拉沃。 – ghayes 2013-07-14 21:23:06

相關問題