2015-06-15 8 views
6

Может кто-нибудь объяснить процесс двойной отправки в Pharo 4.0 с помощью Smalltalk? Я новичок в Smalltalk, и мне трудно понять концепцию, поскольку она реализована по-разному в Java по сравнению с Smalltalk. Это будет очень полезно, если кто-нибудь сможет объяснить это примером.Двойная отправка в Pharo

ответ

9

По существу, идея заключается в том, что у вас есть метод:

  • #addInteger:, который знает, как добавить целых чисел,
  • #addFloat: который знает, как добавить поплавки,
  • и так далее ...

Сейчас в Integer класс, который вы определяете + as:

+ 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