簡體   English   中英

Smalltalk中的消息轉發

[英]Message forwarding in 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:。

由於您希望將對象作為參數傳遞,因此您必須將它們作為使用消息模式的單獨列表傳遞,如下所示:

someObject sendMessage:aSelector withArguments:argumentList

然后你實現#sendMessage:withArguments:as:

sendMessage:aSelector withArguments:argumentList

代表們:[:del | del perform:aSelector withArguments :: argumentList]。

並且您可以使用真實對象作為args轉發任意復雜的消息:

| 參數|

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

someObject sendMessage:#foo:bar:baz:withArguments:arguments

我認為這對大多數方言都是可移植的......

嘗試實現它(它只會轉發具有委托的對象無法理解的消息):

doesNotUnderstand: aMessage 
    delegates
        do: [:delegate | aMessage sendTo: delegate]

您可以顯式構造Message對象,如:

msg := Message selector: #foo arguments: #(bar baz)
"then use them like:"
anObject perform: msg selector with: msg arguments

在Squeak中,請參閱ObjectTracer類。 您可以使用它來攔截發送給Object的所有消息。

好吧,不知道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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM