在Object中的模块中混合会导致所有对象将该模块的实例方法作为单例方法inheritance
当我尝试将自己的行为添加到Object
类时,我会得到在将模块混合到用户定义的类时不会发生的不良影响。
module Entity def some_instance_method puts 'foo' end def self.secret_class_method puts 'secret' end module ClassMethods def some_class_method puts 'bar' end end def self.included( other_mod ) other_mod.extend( ClassMethods ) end end
现在,我创建类Bob
,使其包含Entity
。
class Bob; include Entity; end;
这产生了期望和预期的输出:
Bob.secret_class_method #=> NoMethodError Bob.some_instance_method #=> NoMethodError Bob.some_class_method #=> bar Bob.new.secret_class_method #=> NoMethodError Bob.new.some_instance_method #=> foo Bob.new.some_class_method #=> NoMethodError
但是,如果不是定义类Bob
而是打开类Object
并包含Entity
如下所示:
class Object; include Entity; end
然后我看到的输出是这样的:
Object.secret_class_method #=> NoMethodError Object.some_instance_method #=> foo Object.some_class_method #=> bar Object.new.secret_class_method #=> NoMethodError Object.new.some_instance_method #=> foo Object.new.some_class_method #=> NoMethodError
如果我然后定义类Bob
,它的行为方式相同:可以在类Bob
上调用some_instance_method
。 似乎有些关于Object
类本身的东西正在弄乱这个模式的行为,否则我只是在这里做错了。 有人可以解释这个奇怪的行为吗? 我不希望我的所有Object
都将实例方法作为单例方法inheritance!
Bob
是一个对象(更确切地说: Bob
是Class
一个实例,它是Module
的子类,它是Object
的子类,它是Entity
的子类),因此它具有Entity
的方法。 这就是inheritance的工作原理。