Smalltalk “这是真的吗?”;元类类;只是元类吗?
我遇到了以下陈述:Smalltalk “这是真的吗?”;元类类;只是元类吗?,smalltalk,squeak,Smalltalk,Squeak,我遇到了以下陈述: (Metaclass class) new. "Uses the new of Behavior but throws error because Metaclass class is singleton" Metaclass new. "Uses the new of Behavior" 我认为元类类是元类那么为什么答案不同呢? 我似乎不明白方法查找是如何工作的。我需要遵循哪个层次结构树?我在哪里可以找到一个几乎完整的树,其中包含基本类?类/元类关系是Smalltalk中
(Metaclass class) new. "Uses the new of Behavior but throws error because Metaclass class is singleton"
Metaclass new. "Uses the new of Behavior"
我认为
元类类
是元类
那么为什么答案不同呢?
我似乎不明白方法查找是如何工作的。我需要遵循哪个层次结构树?我在哪里可以找到一个几乎完整的树,其中包含基本类?类/元类关系是Smalltalk中最复杂的主题之一,但也是所有内容如何以一致的方式组合在一起的优雅的一部分 方法查找从对象类(该类描述对象)持有的MethodDictionary开始,然后沿着继承链进行 通常,您不应该创建元类的新实例,但应该让IDE/工具为您创建元类,作为创建新类的副作用(将#'subclass:…'发送到现有的超类) 您可以在Smalltalk映像中找到基本类的树。细节取决于方言,Squeak应该有一个“类层次浏览器”,允许您查看内容 下面是一张图片,可以帮助我形象化这些关系 新的
信息中有一些魔力,理解它需要一些努力。我们应该注意的是:
如果#new
是在行为
中实现的,那么类如何理解#new
,这不是我们类的超类
例如,objectnew
创建了一个全新的Object
实例,即使Object
不是#new
的根实现者的子类(例如,行为
)
为了更好地理解这一点,请注意,objectnew
不是发送给Object
实例的消息,而是发送给类Object
。因此,查找将从对象
类开始,该类是元类
,即对象类
看起来通过元类的查找机制将遵循一条特殊的路径:它从被暗示的元类开始,比如说对象类
。如果找不到选择器,它将在继承层次结构中一直上升到ProtoObject类
(如果需要)。但是,这并不止于此。它跳转到抽象类class
,继续查找。从这里开始,它再次沿着层次结构上升。所有发送到类的消息都会发生这种情况,而不仅仅是#new
。在对象新建
的情况下,它将在行为
中找到实现者
有一点很有趣:
当查找到达Class
时,它不再是类侧搜索,而是实例侧搜索
还有一个问题:
查找如何从原型对象类
跳转到类
实际上根本没有跳跃。结果是:
ProtoObject superclass == nil.
但是
由于查找发送#超类
消息以跟随继承链,因此它将自然地从ProtoObject类
转换到类
,而无需执行任何特殊操作
这里特别详细的是,对于所有类,除了ProtoObject
之外,我们有
AnyClass class superclass == AnyClass superclass class "<- algebraic commutativity"
AnyClass超类==AnyClass超类“元类类
不是元类
,而是它的一个实例。混淆可能来自这样一个事实:Metaclass class==Metaclass
。但是如果Number new.
,为什么它会使用behavior的new
方法呢?据我所知,Number
不是从行为继承的。请参见下面Leandro的精彩讨论,但基本要点是,当您发送消息时,方法查找在接收方的类中进行。如果接收者是Number
(碰巧是类
),则方法查找在Number类
(碰巧是元类
)中进行,这是行为
的一个子类。我冒昧地强调了最后一段,这对理解整个画面非常重要。
AnyClass class superclass == AnyClass superclass class "<- algebraic commutativity"