2015-06-15 56 views
6

請問有人能解釋Pharo 4.0中用Smalltalk進行雙派遣的過程嗎?我是Smalltalk的新手,並且難以理解這個概念,因爲它在Java中的實現與Smalltalk相比非常不同。如果有人能用一個例子來解釋它,這將會非常有幫助。Pharo中的雙派遣

回答

9

本質的想法是,你有方法:

  • #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

+1

謝謝,現在已經非常合理。基本上你可以調用一個通用的方法,在所有相關的類中定義它。但是在你想要實際參數的特定類中,你可以使用特定的參數進行一些具體的實現。當確定方法調用時,根據對象的選擇器和接收器確定調用哪種方法。 – ruhi