簡體   English   中英

發送給Smalltalk中超類的“class”消息

[英]“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"

這意味着在ClassBClassC重寫了繼承的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_superclassSub發送super class ,你得到Sub

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM