Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;“类”;在Smalltalk中发送给超类的消息 让我们考虑以下类: Object subclass: Sup []. Sup subclass: Sub [ print_superclass [ super class printOn: stdout. ] ]._Smalltalk_Superclass - Fatal编程技术网

&引用;“类”;在Smalltalk中发送给超类的消息 让我们考虑以下类: Object subclass: Sup []. Sup subclass: Sub [ print_superclass [ super class printOn: stdout. ] ].

&引用;“类”;在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仅表示对

当我尝试在Sub上运行
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"