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