2009-05-19 63 views
4

因此,我正在編寫一個應用程序,其中一個對象有一堆將它轉發郵件的委託對象。這個想法是,我可以說Smalltalk中的郵件轉發

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 :.

回答

7

既然你想傳遞作爲參數的對象,你就必須在將它們作爲一個SE

someObject的sendMessage:aSelector withArguments:參數列表

然後你實現#sendMessage:withArguments:如:

的sendMessage使用如下消息模式的parate列表: aSelector withArguments:argumentList

委託人:[:del | del執行:aSelector withArguments :: argumentList]。

而且你可以轉發使用真實對象作爲ARGS任意複雜的消息:

|參數|

arguments:= Array with:Object new with:1234.5 with:('key' - >'value')。

someObject的sendMessage:#foo:條:巴茲:withArguments:參數

我覺得這是可以移植到大多數方言,以及...

2

嘗試實現這一點(它只會轉發郵件不是由對象瞭解,代表):

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 
+0

感謝您的建議,但對象與代表屬於同一類型,所以我無法做到這一點。我將其添加到原始問題中。 – Alex 2009-05-19 19:09:47

+0

也許你可以爲這個委託集合創建一個新類,然後使用doesNotUnderstand?如果不進行更明確的消息創建,它可能是最直接的方式。 – 2009-05-19 20:18:15

0

爲什麼不簡單地使用多態,就是在你調用的每個對象的類中實現這個方法?然後你在你的對象方法中使用相同的名稱來實現,它只是將一個調用委託給所有的子對象。喜歡的東西:

MyObjectClass>>someMethod 
subobjects do: [:each | each someMethod] 
1

好了,不知道aMessage是什麼,因爲你提到的所有代表的對象是同一類的,我會做一些事情,如:

MyobjectClass>>SendMessage: aMessage 

    self doSomethingUsefulOnThisInstanceIfApplicable: aMessage. 
    self dependents do: [:ea | ea SendMessage: aMessage ] . 

您可能還需要看,看是否使用下列任何消息可以爲你工作:(這些都是從Cincom的VisualWorks中)

update: 
update:with: 
update:with:from: 
2

在佳樂,請參閱類ObjectTracer。您可以使用它截取所有發送給對象的消息。