Override-Modul-Methode von einem anderen Modul
Möchte ich überschreiben einer Methode aus einem Modul von einem anderen Modul B, die monkey-patch A.
http://codepad.org/LPMCuszt
module A
def foo; puts 'A' end
end
module B
def foo; puts 'B'; super; end
end
A.module_eval { include B } # why no override ???
class C
include A
end
# must print 'A B', but only prints 'A' :(
C.new.foo
- Dies war ein
alias_method_chain
Fall.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sowie ein Modul legt es oben dem Modul/Klasse, wie es in der Klassen-Hierarchie. In anderen Worten, Ein#foo ist nicht super B#foo, sondern eher anders herum.
Wenn Sie daran denken, ein Modul als eine Weise zu tun, die mehrfache Vererbung, das macht Sinn,
include SomeModule
ist eine Art zu sagen, "Behandeln SomeModule, wie es ist ein Elternteil der Klasse für mich".Bekommen die Ausgabe, die Sie wollte, dass Sie umkehren müssen, die Aufnahme so, dass B schließt Ein:
Edit in Antwort zu Kommentar:
Dann entweder gehören A und B in C mit B nach A:
oder patch Eine in C selbst und nicht die Mühe mit B.
Der einzige Weg für diese zu arbeiten ist, wenn die Methode lookup auf C ist C -> B -> A und es gibt keine Möglichkeit, dies zu tun, ohne B in C.
Dies ist auch eine Lösung auf Ihre Frage. Ich bin versucht, zu erreichen mit Modul Haken
included
. Wenn Sie die Modul A in Klasse C. enthalten callbacks definiert in Modul A wird aufgerufen und ausgeführt. Wir haben die Modul B auf-Fliegen. Also unsere Modul A Methode foo nicht durch Modul B foo zum drucken der Superklasse Modul-Methode nur aufgerufen super.Einen anderen Weg, dies zu erreichen, binden Sie das Modul B, wenn das Modul A ist im Lieferumfang enthalten.