在Smalltalk中将“类”消息发送给超类

时间:2019-06-21 17:14:12

标签: smalltalk superclass

让我们考虑以下课程:

Object subclass: Sup [].

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

当我尝试在Sub上运行print_superclass方法时

> Sub new print_superclass.
Sub

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

2 个答案:

答案 0 :(得分:2)

因为super是指向消息接收者的伪变量。 超级和自我指向相同的对象并具有相同的标识。

super == self ---> true

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

定义令人困惑,但在这种情况下,super仅表示搜索#class的方法不是在 Sub 方法中开始,而是在 Sup 方法中开始。但是,它没有效果,因为#class在层次结构的更高级别中定义,并且其实现引用接收方的类,即Sub

的实例。

答案 1 :(得分:1)

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

示例1

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

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

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"

因此,当您从super class发送Sub时,它将调用Object >> class,对吗?与发送self class相同(因为{{1}中未实现class),即Sub。而且由于SubSub new print_superclass发送了super class,所以您得到了Sub