2013-03-26 14 views
5

私はクラスAとモジュールBを持っています。 BAに含める/拡張したいが、含まれている/拡張されたメソッドをプライベートとしてマークする(Aの呼び出し元にはアクセスできないが、Aのメソッド内でアクセスできる)。モジュールをインクルード/拡張することはできますが、すべてのインクルード/拡張メソッドをプライベートとしてマークできますか?

BAに含めるにはどうすればよいですか?

+1

多分これは委任/構図ではなく、継承に適し仕事ですか? –

+0

@RonDahlgrenあなたが提案したものを詳しく説明したり提供したりリンクしたりできますか? –

+0

委任は、Bの内部インスタンス(デリゲート)を保持することを含むデザインパターンです。公開したいメソッドは、Aのメソッドとして記述する必要があります。実装ではBの内部インスタンスを呼び出すだけです(「デリゲート」)。コンポジションはあまり具体的ではない委任形式です。コンポジット異なる異種のクラスのインスタンス。 Wikipedia:http://en.wikipedia.org/wiki/Delegation_patternおよびhttp://en.wikipedia.org/wiki/Object_composition –

答えて

6

含まれているメソッドをすべて含めて明示的に非公開にしますか?

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

あなたは猿private_includeprivate_extendを追加するModuleにパッチを適用することができます

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

質問に答えるのは本当にいいモノクラッチです。ブラボー – ghayes

関連する問題