2017-06-09 4 views
2

Beispielcode:Wie überschreiben erweiterte Methode?

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 

Above Beispielcode ist eine Abstraktion von meinem Problem. erweitert module B on fly (B wird tatsächlich auf Instanz von C erweitert). Methode f2 von B erfüllt meine Bedürfnisse nicht, also möchte ich f2 überschreiben. Wie implementiert man das?

+2

gut, Sie _are_ Überschreiben 'C# f2' mit einem von 'B'. Gibt es einen Grund, warum Sie diese dynamische Erweiterung anstelle des üblichen Includes ausführen? –

+0

Weil 'B' in meinem echten Code ein konfigurierbares Plugin ist. – TieDad

Antwort

2

Ich mag es tatsächlich nicht in initialize zu erweitern. Es gibt viele Gründe, das "Plugin" anders zu implementieren. Aber wenn Sie auf diese Art und Weise „in den Fuß schießen“, ok, tun nur eine weitere erweitern:

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

Danke für die Antwort. In meinem realen Code, ich nicht in initialize erweitern, ich habe eine load_plugin Methode, die auch nicht initialisiert wird. – TieDad

+0

Ich meinte "erweitern" im laufenden Betrieb ist nicht die beste Idee. Sie können das Designmuster "Strategie" standardmäßiger implementieren. Zum Beispiel können Sie Ihre Plugins als Klassen mit derselben Schnittstelle implementieren und ihren Klassennamen oder ihre Instanz auf 'C'' initialize' setzen. Oder Sie können DSL erstellen, das eine längere Ladezeit für den Code bietet als die Laufzeit. Es ist ein ziemlich normaler Weg, um Code für Rails und andere Frameworks und Edelsteine ​​zu konfigurieren. –