Известно, что в Ruby методы класса наследуются:
class P
def self.mm; puts 'abc' end
end
class Q < P; end
Q.mm # works
Однако для меня неожиданно для меня, что он не работает с mixins:
module M
def self.mm; puts 'mixin' end
end
class N; include M end
M.mm # works
N.mm # does not work!
Я знаю, что метод #extend может сделать это:
module X; def mm; puts 'extender' end end
Y = Class.new.extend X
X.mm # works
Но я пишу mixin (или, скорее, хотел бы написать), содержащий как методы экземпляра, так и методы класса:
module Common
def self.class_method; puts "class method here" end
def instance_method; puts "instance method here" end
end
Теперь я хотел бы сделать следующее:
class A; include Common
# custom part for A
end
class B; include Common
# custom part for B
end
Я хочу, чтобы A, B наследовали методы экземпляра и класса из модуля Common. Но, конечно, это не работает. Итак, разве нет секретного способа сделать эту работу наследования одним модулем?
Мне кажется нецелесообразным разбить его на два разных модуля, один из которых будет включать, а другой - расширить. Другим возможным решением было бы использовать класс Common вместо модуля. Но это всего лишь обходной путь. (Что, если есть два набора общих функциональных возможностей Common1 и Common2, и нам действительно нужно иметь mixins?) Есть ли какая-то серьезная причина, почему наследование класса методов не работает из mixins?