【问题标题】:"class" message sent to superclass in Smalltalk“类”消息发送到 Smalltalk 中的超类
【发布时间】:2019-11-04 13:36:10
【问题描述】:

让我们考虑以下类:

Object subclass: Sup [].

Sup subclass: Sub [ print_superclass [ super class printOn: stdout. ] ].

当我尝试在 Sub 上运行 print_superclass 方法时,我得到了

> Sub new print_superclass.
Sub

我希望在这里得到Sup,因为class 调用已移回Sub 的超类Sup。为什么会这样?

【问题讨论】:

    标签: smalltalk superclass


    【解决方案1】:

    你得到的行为是预期的。关键在于super 的语义。在分析您的案例之前,让我们看一些示例:

    示例 1

    ClassA         "implements msg"
      ClassB       "implements msg"
        ClassC     "implements msg"
    

    这意味着msg 的继承版本在ClassBClassC 中被覆盖。在这种情况下

    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_superclassSub 发送super class,你得到Sub

    【讨论】:

      【解决方案2】:

      因为 super 是指向消息接收者的伪变量。 super 和 self 指向同一个对象,具有相同的标识。

      super == self ---> true
      

      它们之间的区别在于 super 告诉消息查找开始在包含该方法的方法字典“上方”中搜索下一个。

      定义比较混乱,但在这种情况下,super 只表示#class 的方法搜索不是从Sub 方法开始,而是从Sup 方法开始。但是,它没有效果,因为#class是在层次结构的更高级别定义的,它的实现是指接收者的类,即Sub的一个实例

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-27
        • 2011-01-08
        • 1970-01-01
        • 2019-04-27
        • 2012-10-26
        • 2019-05-31
        • 2011-08-31
        • 1970-01-01
        相关资源
        最近更新 更多