Может кто-нибудь объяснить процесс двойной отправки в Pharo 4.0 с помощью Smalltalk? Я новичок в Smalltalk, и мне трудно понять концепцию, поскольку она реализована по-разному в Java по сравнению с Smalltalk. Это будет очень полезно, если кто-нибудь сможет объяснить это примером.Двойная отправка в Pharo
ответ
По существу, идея заключается в том, что у вас есть метод:
#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
Спасибо, это имеет смысл сейчас. В основном вы вызываете общий метод, определяете его во всех связанных классах. Но в пределах определенных классов, к которым вы хотите, чтобы аргументы фактически выполнялись, вы добавляете определенную реализацию с конкретными аргументами. Когда вызов метода определяется, он определяет, какой метод вызывать на основе селектора и приемника объекта. – ruhi