3

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

4

2 回答 2

6

当然,您可以通过修改Ruby 源代码的相关部分并重新编译 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 核心中的那些)现在都将从这个新的默认超类继承。您可以更轻松地获得相同的效果(只是没有不同的名称),并且不需要自定义 Ruby ,只需更改Object其自身即可。这就是能够重新开课的美妙之处!例如:

class Object
  def foo
    'bar!'
  end
end

class A; end

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

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

于 2013-06-27T03:10:26.753 回答
0

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

于 2013-06-27T10:10:11.340 回答