4

したがって、1つのオブジェクトに、メッセージの転送先となる一連のデリゲートオブジェクトがあるアプリケーションを作成しています。アイデアは私が言うことができるということです

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

それは機能しますが、より良い方法が必要です。このソリューションは、引数を文字列に制限し、単純に醜いです。誰かがメッセージを転送するためのよりクリーンでより良い方法を知っていますか?

ところで、私はsqueakを使用していますが、実装に依存しないソリューションが好まれます;)

編集:デリゲートはオブジェクトと同じクラスであるため、DoesNotUnderstand:をオーバーライドすることはできません。

4

5 に答える 5

7

オブジェクトを引数として渡したいので、次のようなメッセージパターンを使用する別のリストとしてオブジェクトを渡す必要があります。

someObject sendMessage:aSelector withArguments:argumentList

次に、#sendMessage:withArguments:as:を実装します。

sendMessage:aSelector withArguments:argumentList

代表者は:[:del | デルパフォーム:aSelector withArguments::argumentList]。

そして、実際のオブジェクトを引数として使用して、任意に複雑なメッセージを転送することができます。

| 引数|

引数:=配列with:オブジェクトnew with:1234.5 with :('key'->'value')。

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

これはほとんどの方言にも移植できると思います...

于 2009-05-20T01:03:28.697 に答える
2

Squeakで、クラスObjectTracerを参照してください。これを使用して、オブジェクトへのすべてのメッセージ送信をインターセプトできます。

于 2009-05-20T16:33:05.243 に答える
2

これを実装してみてください(デリゲートを持つオブジェクトによって理解されないメッセージのみが転送されます):

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
于 2009-05-19T18:42:35.993 に答える
1

ええと、aMessageが何であるかを知らなくても、そしてあなたがすべてのデリゲートオブジェクトが同じクラスであると言ったので、私は次のようなことをします:

MyobjectClass>>SendMessage: aMessage

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

また、次のメッセージのいずれかを使用できるかどうかを確認することもできます:(これらはCincom VisualWORKSからのものです)

update: 
update:with:
update:with:from:
于 2009-05-19T20:18:32.420 に答える
0

単純にポリモーフィズムを使用しないのはなぜですか。つまり、呼び出している各オブジェクトのクラスにこのメソッドを実装しますか?次に、同じ名前のオブジェクトメソッドに実装します。これは、すべてのサブオブジェクトへの呼び出しを委任するだけです。何かのようなもの:

MyObjectClass>>someMethod
subobjects do: [:each | each someMethod]
于 2009-05-19T19:26:39.873 に答える