因此,我正在写,其中一个对象具有一堆委托的对象,它将消息转发到应用程序。这个想法是,我可以说

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]
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top