"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
的继承版本在 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"
因此,当您从 Sub
发送 super class
时,它会调用 Object >> class
,对吗?这与发送self class
(因为class
在Sub
中没有实现)是一样的,即Sub
。由于 Sub new print_superclass
从 Sub
发送 super class
,你得到 Sub
.
让我们考虑以下 类:
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
的继承版本在 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"
因此,当您从 Sub
发送 super class
时,它会调用 Object >> class
,对吗?这与发送self class
(因为class
在Sub
中没有实现)是一样的,即Sub
。由于 Sub new print_superclass
从 Sub
发送 super class
,你得到 Sub
.