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"