Il est connu qu'en Ruby, les méthodes de la classe avoir hérité:
class P
def self.mm; puts 'abc' end
end
class Q < P; end
Q.mm # works
Cependant, il vient comme une surprise pour moi que ça ne fonctionne pas avec mixin:
module M
def self.mm; puts 'mixin' end
end
class N; include M end
M.mm # works
N.mm # does not work!
Je sais que #étendre la méthode à suivre:
module X; def mm; puts 'extender' end end
Y = Class.new.extend X
X.mm # works
Mais je suis en train d'écrire un mixin (ou, plutôt, voudrais écrire) contenant à la fois des méthodes d'instance et les méthodes de la classe:
module Common
def self.class_method; puts "class method here" end
def instance_method; puts "instance method here" end
end
Maintenant ce que j'aimerais faire, c'est ceci:
class A; include Common
# custom part for A
end
class B; include Common
# custom part for B
end
Je tiens A, B hériter à la fois de l'instance et les méthodes de la classe de module Commun. Mais, bien sûr, cela ne fonctionne pas. Alors, n'est-ce pas là un secret de faire de cet héritage de travail à partir d'un seul module?
Il semble peu élégante pour moi de diviser cela en deux modules différents, l'un pour comprendre l'autre pour étendre. Une autre solution possible serait d'utiliser une classe Commune à la place d'un module. Mais c'est juste une solution de contournement. (Si il y a deux ensembles de fonctionnalités communes Common1 et Common2 et nous avons vraiment besoin de ma mixin?) Est-il une profonde raison de la méthode de classe de l'héritage ne fonctionne pas à partir de mixin?