"class" 消息发送到 Smalltalk 中的超类

"class" message sent to superclass in Smalltalk

让我们考虑以下 类:

Object subclass: Sup [].

Sup subclass: Sub [ print_superclass [ super class printOn: stdout. ] ].

当我尝试在 Sub 上使用 运行 print_superclass 方法时,我得到

> Sub new print_superclass.
Sub

我希望在这里得到 Sup,因为 class 调用被移回 Sub 的超类,即 Sup。为什么会这样?

因为super是一个pseudo-variable指向消息的接收者。 super 和 self 指向同一个对象,具有相同的标识。

super == self ---> true

它们之间的区别在于 super 告诉消息查找开始搜索包含该方法的方法字典 "above" 中的下一个。

定义比较混乱,但是这里super只说#class的方法搜索不是在Sub方法中开始的,而是在Sup 方法。但是,它没有效果,因为#class 定义在层次结构的更高级别,其实现引用接收者的 class,即 Sub

的实例

您得到的行为是预期的行为。关键在于 super 的语义。在分析您的案例之前,让我们先看一些示例:

示例 1

ClassA         "implements msg"
  ClassB       "implements msg"
    ClassC     "implements msg"

这意味着 msg 的继承版本在 ClassBClassC 中被覆盖。在这种情况下

super msg       "sent from ClassC invokes ClassB >> msg"
super msg       "sent from ClassB invokes ClassA >> msg"
super msg       "sent from ClassA will signal MessageNotUnderstood"

(我假设 msg 上面没有实现 ClassA

示例 2

ClassA         "implements msg"
  ClassB       "does not implement msg"
    ClassC     "implements msg"

然后

super msg       "sent from ClassC invokes ClassA >> msg"
super msg       "sent from ClassB invokes ClassA >> msg"

示例 3

ClassA         "implements msg"
  ClassB       "does not implement msg"
    ClassC     "does not implement msg"

这里

super msg       "sent from ClassC invokes ClassA >> msg"
super msg       "sent from ClassB invokes ClassA >> msg"

因此,super 的语义是:在我的超类中开始查找

你的情况

你有

Object         "implements class"
  Sup          "does not implement class"
    Sub        "does not implement class"

因此,当您从 Sub 发送 super class 时,它会调用 Object >> class,对吗?这与发送self class(因为classSub中没有实现)是一样的,即Sub。由于 Sub new print_superclassSub 发送 super class,你得到 Sub.