Dziedziczenie metod klas z modułów / miksów w Ruby
Wiadomo, że w Ruby metody klasowe są dziedziczone:
class P
def self.mm; puts 'abc' end
end
class Q < P; end
Q.mm # works
Jednak zaskakuje mnie, że nie działa z miksami:
module M
def self.mm; puts 'mixin' end
end
class N; include M end
M.mm # works
N.mm # does not work!
Wiem, że metoda #extend może to zrobić:
module X; def mm; puts 'extender' end end
Y = Class.new.extend X
X.mm # works
Ale piszę mixin (lub raczej chciałbym pisać) zawierający zarówno metody instancji, jak i metody klas:
module Common
def self.class_method; puts "class method here" end
def instance_method; puts "instance method here" end
end
Teraz chciałbym to zrobić:
class A; include Common
# custom part for A
end
class B; include Common
# custom part for B
end
Chcę, aby A, B dziedziczyły zarówno metody instancji, jak i klasyCommon
moduł. Ale to oczywiście nie działa. Czy więc nie istnieje tajny sposób na sprawienie, aby dziedziczenie działało z jednego modułu?
Wydaje mi się nieistotne, aby podzielić to na dwa różne moduły, jeden do włączenia, drugi do rozszerzenia. Innym możliwym rozwiązaniem byłoby użycie klasyCommon
zamiast modułu. Ale to tylko obejście. (Co jeśli istnieją dwa zestawy wspólnych funkcjiCommon1
iCommon2
i naprawdę musimy mieć miksy?) Czy istnieje jakiś głęboki powód, dla którego dziedziczenie metod klasowych nie działa z miksów?