&引用;“类”;在Smalltalk中发送给超类的消息 让我们考虑以下类: Object subclass: Sup []. Sup subclass: Sub [ print_superclass [ super class printOn: stdout. ] ].
当我尝试在Sub上运行&引用;“类”;在Smalltalk中发送给超类的消息 让我们考虑以下类: Object subclass: Sup []. Sup subclass: Sub [ print_superclass [ super class printOn: stdout. ] ].,smalltalk,superclass,Smalltalk,Superclass,当我尝试在Sub上运行print\u超类方法时,我得到 > Sub new print_superclass. Sub 我希望在这里得到Sup,因为class调用被移回Sub的超类,即Sup。为什么会这样呢?因为super是一个指向消息接收者的伪变量。 Super和self指向同一个对象并具有相同的标识 super == self ---> true 它们之间的区别在于super告诉消息查找开始搜索方法字典“上面”中包含该方法的下一个 定义令人困惑,但在本例中,super仅表示对
print\u超类
方法时,我得到
> Sub new print_superclass.
Sub
我希望在这里得到
Sup
,因为class
调用被移回Sub
的超类,即Sup
。为什么会这样呢?因为super是一个指向消息接收者的伪变量。
Super和self指向同一个对象并具有相同的标识
super == self ---> true
它们之间的区别在于super告诉消息查找开始搜索方法字典“上面”中包含该方法的下一个
定义令人困惑,但在本例中,super仅表示对#类的方法搜索不是从Sub方法开始,而是从Sup方法开始。但是,它没有效果,因为#类是在层次结构的更高级别中定义的,它的实现引用接收方的类,即Sub的实例。您得到的行为是预期的行为。关键在于
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"
然后
示例3
ClassA "implements msg"
ClassB "does not implement msg"
ClassC "does not implement msg"
这里
因此,super
的语义是:在我的超类中开始查找
您的案例
你有
Object "implements class"
Sup "does not implement class"
Sub "does not implement class"
因此,当您从Sub
发送super类
时,它将调用Object>>类
,对吗?这与发送self class
(因为class
未在Sub
中实现)相同,即Sub
。由于Sub new print\u superclass
从Sub
发送super class
,因此您将获得Sub
super msg "sent from ClassC invokes ClassA >> msg"
super msg "sent from ClassB invokes ClassA >> msg"
Object "implements class"
Sup "does not implement class"
Sub "does not implement class"