Heredando métodos de clase de módulos / mixins en Ruby
Se sabe que en Ruby, los métodos de clase se heredan:
class P
def self.mm; puts 'abc' end
end
class Q < P; end
Q.mm # works
Sin embargo, me sorprende que no funcione con mixins:
module M
def self.mm; puts 'mixin' end
end
class N; include M end
M.mm # works
N.mm # does not work!
Sé que el método #extend puede hacer esto:
module X; def mm; puts 'extender' end end
Y = Class.new.extend X
X.mm # works
Pero estoy escribiendo una mezcla (o, más bien, me gustaría escribir) que contiene métodos de clase y métodos de instancia:
module Common
def self.class_method; puts "class method here" end
def instance_method; puts "instance method here" end
end
Ahora lo que me gustaría hacer es esto:
class A; include Common
# custom part for A
end
class B; include Common
# custom part for B
end
Quiero que A, B herede los métodos de instancia y de clase deCommon
módulo. Pero, por supuesto, eso no funciona. Entonces, ¿no hay una manera secreta de hacer que esta herencia funcione desde un solo módulo?
Me parece poco elegante dividir esto en dos módulos diferentes, uno para incluir y otro para extender. Otra posible solución sería utilizar una clase.Common
En lugar de un módulo. Pero esto es sólo una solución. (¿Qué pasa si hay dos conjuntos de funcionalidades comunesCommon1
yCommon2
¿Y realmente necesitamos tener mixins?) ¿Hay alguna razón profunda por la que la herencia del método de clase no funcione con los mixins?