你能改变Ruby中类的默认继承吗?

时间:2013-06-27 02:57:12

标签: ruby class inheritance metaprogramming

作为一个小爱好项目,我正在尝试建立自己的对象系统。我想知道是否有一种方法可以将所有类的默认继承从Object更改为我的基类Entity,这样每当我创建一个新类时,我都不必明确地说{{ 1}};理想情况下,我只能说class Thing < Entity并将其默认超类定为我的class Thing类。

2 个答案:

答案 0 :(得分:6)

当然,您可以通过修改relevant part of the Ruby source并重新编译Ruby来实现此目的:

VALUE
rb_define_class_id(ID id, VALUE super)
{
    VALUE klass;

    if (!super) super = rb_cObject;  // <-- where the default is set
    klass = rb_class_new(super);
    // ...

但这是一个巨大的麻烦,需要修补和运行自定义Ruby,可能有很多陷阱和硬编码的东西,假设Object是默认值。

而且,最重要的是,重点是什么?如果用其他东西替换Object作为默认超类,那么每个类 - 包括Ruby核心中的类 - 现在将继承自这个新的默认超类。只需更改Object本身,就可以更轻松地获得相同的效果(只是没有不同的名称),而无需自定义Ruby 。这是能够重新开课的美妙之处!例如:

class Object
  def foo
    'bar!'
  end
end

class A; end

A.new.foo  #=> 'bar!'

如果您想要善良,您甚至可以将所有相关方法放在Entity模块而不是类中,然后将include放入Object

答案 1 :(得分:0)

不,不幸的是,这在Ruby中是不可能的。 Ruby没有像Meta-Object协议那样的元对象协议。允许您操作对象模型的核心语义的CLOS。不过,这会很好!