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