信息中有一些魔力#new
,理解需要付出一些努力。应该引起我们注意的是:
一个类如何理解#new
给定#new
的实现Behavior
,它不是我们类的超类?
例如,Object new
创建一个全新的实例,Object
即使Object
它不是#new
(例如Behavior
)的根实现者的子类。
为了更好地理解这一点,请注意这Object new
不是发送给实例的消息,Object
而是发送给类的消息Object
。因此查找将从Object
属于 a的类开始Metaclass
,即Object class
。
看起来通过元类的查找机制将遵循一条特殊的路径:它从提到的元类开始,比如Object class
. 如果它没有找到选择器,它会在继承层次结构中一直向上直到ProtoObject class
需要。但是,它并不止于此。它跳到抽象类Class
继续查找。从那里它再次跟随层次结构上升。这发生在所有发送到类的消息中,而不仅仅是#new
. 在 的情况下Object new
,它会在 中找到实现者Behavior
。
有一些有趣的观察:
当查找到达Class
时,它不再是类端搜索,而是实例端搜索。
一个问题仍然存在:
ProtoObject class
查找如何从to跳转Class
?
好吧,实际上根本没有跳跃。会发生什么:
ProtoObject superclass == nil.
但
ProtoObject class superclass == Class
并且由于查找发送#superclass
消息遵循继承链,它会自然地从 过渡到ProtoObject class
,Class
而无需做任何特别的事情。
这里的特殊细节是,对于所有类,除了ProtoObject
我们有
AnyClass class superclass == AnyClass superclass class "<- algebraic commutativity"
但是,ProtoObject
情况并非如此,ProtoObject
isnil
的超类而是 is 的超ProtoObject class
类Class
。
笔记
这也是a具有不是a的超类的唯一情况。这正是解决建模循环性的例外。Metaclass
Metaclass