7

誰か、Pharo 4.0 の Smalltalk での二重ディスパッチのプロセスを説明してもらえますか? 私は Smalltalk を初めて使用し、Java での実装が Smalltalk とは大きく異なるため、概念を理解するのに苦労しています。誰かが例を挙げて説明できれば非常に役に立ちます。

4

1 に答える 1

13

基本的には、メソッドがあるという考えです:

  • #addInteger:整数を追加する方法を知っている、
  • #addFloat:フロートを追加する方法を知っている、
  • など…</li>

Integerクラスでは、次のように定義+します。

+ otherObject

   otherObject addInteger: self

次のように定義しFloatます。

+ otherObject

   otherObject addFloat: self

このよう+に、オブジェクトに送信するだけで、必要なメソッドを使用してオブジェクトを追加するように受信者に要求します。

もう 1 つの戦略は、#adaptTo:andSend:メソッドを使用することです。たとえば+Pointクラスでは次のように定義されます。

+ arg 

   arg isPoint ifTrue: [^ (x + arg x) @ (y + arg y)].
   ^ arg adaptToPoint: self andSend: #+

最初に引数が Point かどうかをチェックし、そうでない場合は、引数に Point に適応してシンボル (操作) を送信するように要求します。これにより、わずかに異なる操作を実行する必要があるメソッドの重複が節約されます。

Collection次のようにメソッドを実装します。

adaptToPoint: rcvr andSend: selector

   ^ self collect: [:element | rcvr perform: selector with: element]

そしてNumberそれを次のように実装します:

adaptToPoint: rcvr andSend: selector

   ^ rcvr perform: selector with: self@self

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

于 2015-06-15T22:55:15.660 に答える