2013-03-26 57 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