我的目标是在层次结构中的BasicObject
和Object
之间插入我自己的类(或模块,因为它可能会结果),以便所有{{1}现在从我的类继承(或者像我的模块一样)。这是我的测试设置:
Objects
如果我创建一个module Entity
# Define the singleton method Entity::new such that it generates and returns
# a class which extends Entity.
def self.new(*args, &blk)
c = Class.new(*args, &blk)
c.extend self
c
end
# Singleton method
def self.foo
puts 'foo'
end
# Instance method
def bar
puts 'bar'
end
end
Thing
的课程include
,我会接近我想要的输出:
Entity
thing = Thing.new
thing.bar #=> bar
Thing.foo #=> NoMethodError
的实例继承了我在Thing
中定义的实例方法,但遗憾的是,Entity
类没有继承Thing
的单例方法。
如果我尝试通过打开Entity
类并包含Entity
来向所有对象添加Object
行为,则不仅所有对象都会继承Entity
&#39 ; s实例方法,但它们也将它们作为单例方法继承。
Entity
这不是我想要的。我希望所有对象都完全按照定义继承class Object; include Entity; end
Object.bar #=> bar
Object.new.bar #=> bar
class Bob; end
Bob.bar #=> bar
Bob.new.bar #=> bar
中定义的行为,以便Entity
的实例继承Object
的实例方法,并继承自{Entity
的类。 1}}继承Object
的单例方法,就像标准继承一样。我怎样才能修改我为完成这项工作所做的工作?
答案 0 :(得分:2)
你所描述的正常模式是做这样的事情:
module MyModule
def some_instance_method
end
module ClassMethods
def some_class_method
end
end
def self.included(othermod)
class << othermod
include ClassMethods
end
end
end
只要模块包含在另一个类中,就会调用included方法,然后ClassMethods中的方法将包含在类metaclass中
答案 1 :(得分:1)
已建立的方式(特别是在Rails人员中)是将单例方法定义为某个模块的实例方法,并使用included
钩子将extend
类与它们一起使用。
module Entity
def my_instance_method; ... end
def self.included base; base.extend(ClassMethods) end
module ClassMethods
def my_class_method; ... end
end
end
这与Doydle的回答几乎相同,但有点不同。