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