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