动态修改父类的话,子类的 test 就被父类的覆盖了(可以试试在 class A < Orz 前后调用 test);而在 F12 之后,类继承表对象并没有清空,子类和父类的 test 重新定义,这时再次“动态”地 class A < Orz 就没有效果了(这个可以通过在 class A 定义之后 p 出 A 的父类来证明,F12 前后的父类分别是 Object 和 Orz),因为 A 已经是 Orz 的子类
[line]1[/line]有误,请看 7 楼 ><作者: 沉默的米饭团 时间: 2009-9-22 14:58
咦。。。脚本保存后有先在数据库中也保存吗,如果没有。F12必定会这样作者: goahead 时间: 2009-9-25 16:01
提示: 作者被禁止或删除 内容自动屏蔽作者: 沉影不器 时间: 2009-9-27 21:18
提示: 作者被禁止或删除 内容自动屏蔽作者: 紫苏 时间: 2009-9-27 21:39 本帖最后由 紫苏 于 2009-9-27 22:00 编辑
goahead那样确实是两个类,因为第二个 A 是在 Orz 这个名字空间中定义的,也就是 A 被定义为了 Orz 模块上下文中的一个常量,而不像第一个 A 是在顶层定义的,所以第一个 A 是全局常量~两个不同的常量,自然可以分别指向不同的类对象,即便父类不同,它们也是不同的类……
这就好比文件系统中,c:\ 下有一个叫 A 的文件,c:\Orz 下有个叫 A 的文件~
class A
end
class Orz
class A
end
end
p A.id, Orz::A.id # 不同
复制代码
另外通过 objct_id 测试发现我三楼说的有误,动态改变已定义类的父类的时候,原来的类是被抛弃了,原来的类名常量指向了一个新的 Class 对象,这个类就是为了继承制定父类而重新分配的一个父类~而新分配的这个子类并没有定义 test,所以直接继承了父类的 test,F12后的情况也应该是像上面说的那样~