6
請問有人能解釋Pharo 4.0中用Smalltalk進行雙派遣的過程嗎?我是Smalltalk的新手,並且難以理解這個概念,因爲它在Java中的實現與Smalltalk相比非常不同。如果有人能用一個例子來解釋它,這將會非常有幫助。Pharo中的雙派遣
請問有人能解釋Pharo 4.0中用Smalltalk進行雙派遣的過程嗎?我是Smalltalk的新手,並且難以理解這個概念,因爲它在Java中的實現與Smalltalk相比非常不同。如果有人能用一個例子來解釋它,這將會非常有幫助。Pharo中的雙派遣
本質的想法是,你有方法:
#addInteger:
它知道如何添加整數,#addFloat:
它知道如何添加花車,現將Integer
類定義爲+
爲:
+ otherObject
otherObject addInteger: self
在
Float
你定義它想:
+ otherObject
otherObject addFloat: self
這樣,你只需要發送+
一個對象,然後它會問接收機所要求的方法添加。
另一種策略是使用#adaptTo:andSend:
方法。例如+
在Point
類定義爲:
+ arg
arg isPoint ifTrue: [^ (x + arg x) @ (y + arg y)].
^arg adaptToPoint: self andSend: #+
它首先檢查是否參數是一個點,如果不是的話,問參數,以適應點和發送一些符號(操作),這樣可以節省一些重複必須執行稍微不同操作的方法。
Collection
實現這樣的方法:
adaptToPoint: rcvr andSend: selector
^self collect: [:element | rcvr perform: selector with: element]
和Number
實現它這樣的:
adaptToPoint: rcvr andSend: selector
^rcvr perform: selector with: [email protected]
注意,爲了避免明確的類型檢查,我們可以在Point
本身定義方法這樣:
adaptToPoint: rcvr andSend: selector
^(x perform: selector with: arg x) @ (y perform: selector with: arg y)
您可以在此演示文稿中看到更多示例:http://www.slideshare.net/SmalltalkWorld/stoop-302double-dispatch
謝謝,現在已經非常合理。基本上你可以調用一個通用的方法,在所有相關的類中定義它。但是在你想要實際參數的特定類中,你可以使用特定的參數進行一些具體的實現。當確定方法調用時,根據對象的選擇器和接收器確定調用哪種方法。 – ruhi