最佳答案
众所周知,在 Ruby 中,类方法是继承的:
class P
def self.mm; puts 'abc' end
end
class Q < P; end
Q.mm # works
然而,让我感到惊讶的是,它并不适用于 Mixin:
module M
def self.mm; puts 'mixin' end
end
class N; include M end
M.mm # works
N.mm # does not work!
我知道扩展方法可以做到这一点:
module X; def mm; puts 'extender' end end
Y = Class.new.extend X
X.mm # works
但是我正在编写一个混合(或者,更确切地说,想要编写) ,其中包含实例方法和类方法:
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
,并且我们真的需要 Mixin,那该怎么办?)为什么类方法继承不能从 Mixin 中工作,有什么深层次的原因吗?