En général, un module ne peut jamais remplacer une méthode dans la classe
il est inclus dans l'. C'est parce que le module de l'inclusion fonctionne
comme le sous-classement. Une super-classe ne pouvez pas remplacer ses sous-classes"
méthodes soit, ni voulez-vous attendre d'elle.
Lorsqu'un module est inclus dans une classe, le module est inséré
juste après la classe dans la classe de l'ancêtre de la chaîne. L'appel
super
de la classe va appeler le module demise en œuvre.
class Something
module PreExtension; end
module PostExtension; end
include PreExtension
include PostExtension
end
Something.ancestors # => [Something, Something::PostExtension, Something::PreExtension, Object, Kernel]
Chaque fois qu'une méthode est appelée sur un Something
, Ruby on regarde à travers
cette liste dans l'ordre et appelle la mise en œuvre d'abord qu'il trouve.
Si la mise en œuvre des appels d' super
, il ne cesse de regarder et trouve
à la prochaine.
Cela signifie que les modules inclus par la suite, prendre la priorité sur
modules inclus plus tôt, et peut appeler super
pour obtenir le plus tôt
des modules de mise en œuvre. C'est parce que les modules sont inclus
inséré dans l'ancêtre de la chaîne d' directement après la classe. Cette
est de savoir comment le code de routage edgerunner mentionné œuvres. Ce code
met tout dans des modules, comme suit:
class SomethingNew
module Base
def my_method
puts "(A)"
end
end
module Extension
def my_method
puts "(B)"
super
end
end
include Base
include Extension
end
SomethingNew.new.my_method
# Output:
# >> (B)
# >> (A)
SomethingNew.ancestors # => [SomethingNew, SomethingNew::Extension, SomethingNew::Base, Object, Kernel]
C'est pourquoi, alias_method_chain
existe, en premier lieu. Si mettre la base de code dans un module n'est pas une option, je ne suis pas sûr de la façon de réaliser l'équivalent d' alias_method_chain
.