2017-06-09 12 views
2

サンプルコード:サンプルコードの上拡張メソッドを上書きする方法は?

module B 
    def f2 
    puts "B::f2" 
    end 
end 

class C 
    def initialize 
    extend B 
    end 

    def f2 
    puts "C::f2" 
    end 
end 

c = C.new 
c.f2 

は私の問題を抽象化したものです。 Class Cは、フライでmodule Bを拡張します(Bは実際にはCのインスタンスに拡張されています)。方法f2からBが私のニーズを満たしていないので、f2を上書きしたいと思います。それを実装する方法は?

+2

よく、あなたは 'B' 'から1とC#のf2'を上書き_are_。通常のインクルードの代わりにこの動的拡張を行う理由は何ですか? –

+0

私の実際のコードでは、 'B'は設定可能なプラグインです。 – TieDad

答えて

2

私は実際にはinitializeに広がるのが好きではありません。 「プラグイン」を別の方法で実装する理由はたくさんあります。 しかし、あなたはこの方法を「足で撮影」したい場合は、[OK]を、ただ1以上が伸びるん:

module B 
    def f2 
    puts 'B::f2' 
    end 
end 

class C 
    attr_reader :parent_state 

    def initialize 
    extend B 
    extend BOverrides 

    @parent_state = 'Parent State' 
    end 

    module BOverrides 
    def f2 
     puts 'C::f2' 
     puts 'Yes, I have access to %s' % parent_state 
    end 
    end 
end 

c = C.new 
c.f2 
+0

答えをありがとう。私の実際のコードでは、私は初期化で拡張されていない、私はinitializeで呼ばれていないload_pluginメソッドがあります。 – TieDad

+0

私は飛行機で '延長'を意味するのは良い考えではありません。 'Strategy'デザインパターンをより標準的な方法で実装することができます。例えば、プラグインを同じインターフェースを持つクラスとして実装し、クラス名やインスタンスを 'C''' initialize'にすることができます。または、実行時ではなくコードの読み込み時間を延長するDSLを作成することもできます。 Railsやその他のフレームワークや宝石のコードを設定するためのかなり標準的な方法です。 –

関連する問題