[英]“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是指向消息接收者的伪变量。 超级和自我指向同一个对象并具有相同的身份。
super == self ---> true
它们之间的区别在于super告诉消息查找开始在包含该方法的“上面”方法字典中搜索下一个。
该定义令人困惑,但在这种情况下,super仅表示搜索#class的方法不是在Sub方法中启动,而是在Sup方法中启动。 但是,它没有效果,因为#class是在层次结构的更高级别定义的,它的实现是指接收器的类,即Sub的一个实例
你得到的行为是预期的行为。 关键在于super
的语义。 在分析您的案例之前,让我们看一些例子:
例1
ClassA "implements msg"
ClassB "implements msg"
ClassC "implements msg"
这意味着在ClassB
和ClassC
重写了继承的msg
版本。 在这种情况下
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
相同(因为class
未在Sub
实现),即Sub
。 而且由于Sub new print_superclass
从Sub
发送super class
,你得到Sub
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.