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
あなたは猿private_include
とprivate_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
質問に答えるのは本当にいいモノクラッチです。ブラボー – ghayes
多分これは委任/構図ではなく、継承に適し仕事ですか? –
@RonDahlgrenあなたが提案したものを詳しく説明したり提供したりリンクしたりできますか? –
委任は、Bの内部インスタンス(デリゲート)を保持することを含むデザインパターンです。公開したいメソッドは、Aのメソッドとして記述する必要があります。実装ではBの内部インスタンスを呼び出すだけです(「デリゲート」)。コンポジションはあまり具体的ではない委任形式です。コンポジット異なる異種のクラスのインスタンス。 Wikipedia:http://en.wikipedia.org/wiki/Delegation_patternおよびhttp://en.wikipedia.org/wiki/Object_composition –