使用mixins(或本征类,或其他一些方法),有没有办法模拟向Object添加新的超类?

时间:2013-07-16 15:22:32

标签: ruby inheritance mixins

我的目标是在层次结构中的BasicObjectObject之间插入我自己的类(或模块,因为它可能会结果),以便所有{{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的单例方法,就像标准继承一样。我怎样才能修改我为完成这项工作所做的工作?

2 个答案:

答案 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的回答几乎相同,但有点不同。