让我们考虑以下课程:
Object subclass: Sup [].
Sup subclass: Sub [ print_superclass [ super class printOn: stdout. ] ].
当我尝试在Sub上运行print_superclass
方法时
> Sub new print_superclass.
Sub
我希望在这里得到Sup
,因为class
调用已移回到Sub
的超类Sup
上。为什么会这样呢?
答案 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"
这意味着msg
和ClassB
中的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
。而且由于Sub
从Sub new print_superclass
发送了super class
,所以您得到了Sub
。