在Smalltalk消息转发
-
22-08-2019 - |
题
因此,我正在写,其中一个对象具有一堆委托的对象,它将消息转发到应用程序。这个想法是,我可以说
someObject sendMessage:aMessage
和aMessage将被发送到所有someObject的代表(为aMessage的任何值)。我已经能够做到这一点的唯一方法是这样的:
sendMessage:aMessage
| sel chunks kwords arglist msg |
chunks := aMessage findTokens:' '.
kwords := Array new:(chunks size).
arglist := Array new:(chunks size).
1 to: (chunks size) do: [:i |
kwords at:i put:((chunks at:i) findTokens:':') at:1.
arglist at:i put:((chunks at:i) findTokens:':') at:2].
sel := ''.
kwords do:[:word | sel := sel,word,':'].
msg := Message selector:sel arguments:arglist.
delegates do:[:del | del perform:msg selector with:msg arguments].
它的工作原理,但必须有一个更好的办法。该解决方案限制的参数是字符串,而只是普通的难看。有谁知道一个更清洁,更好的方式来转发消息?
顺便说一句,我使用的吱吱声,但一个实施无关的解决办法中将优先)
修改强>:我要补充的是,代表是相同的类作为对象的,所以不能只覆盖DoesNotUnderstand:
解决方案
由于要传递作为参数的对象,就必须在将它们作为使用如下的消息模式的单独列表:
someObject的sendMessage:aSelector withArguments:参数列表
然后,你实现#sendMessage:withArguments:为:
的sendMessage:aSelector withArguments:参数列表
代表做:[:德尔| 德尔执行:aSelector withArguments::参数列表]
和你能够转发使用真实对象作为ARGS任意复杂的消息:
|参数|
参数:=阵列 有:新对象 搭配:1234.5 用:( '键' - > '值')
someObject的sendMessage:#foo:条:巴兹:withArguments:参数
我觉得这是可以移植到大多数方言,以及...
其他提示
尝试实现该(将不受物体理解仅转发消息那具有的委托):
doesNotUnderstand: aMessage
delegates
do: [:delegate | aMessage sendTo: delegate]
您可以构造消息明确地反对这样的:
msg := Message selector: #foo arguments: #(bar baz)
"then use them like:"
anObject perform: msg selector with: msg arguments
在佳乐,请参阅类ObjectTracer。可以用它来截取所有消息发送到一个对象。
好了,不知道aMessage是什么,因为你提到的所有代表的对象是同一类的,我会做一些事情,如:
MyobjectClass>>SendMessage: aMessage
self doSomethingUsefulOnThisInstanceIfApplicable: aMessage.
self dependents do: [:ea | ea SendMessage: aMessage ] .
您可能也想看看,如果使用任何下列消息可能会为你工作:(这些都是从Cincom的VisualWorks中)
update:
update:with:
update:with:from:
为什么不直接使用的多态性,即实现在每一类此方法对象,你是哪位?然后你实现你的目标的方法具有相同的名称,这只是代表所有子对象的调用。是这样的:
MyObjectClass>>someMethod
subobjects do: [:each | each someMethod]