Известно, что в 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?