Smalltalkの中のメッセージの転送
-
22-08-2019 - |
質問
私は1つの目的は、デリゲートの束を持って、それはへのメッセージを転送することをオブジェクトのアプリケーションを書いていますので。アイデアは、私が言うことができるということです。
someObject sendMessage:aMessage
とaMessageは(aMessageの任意の値のために)SomeObjectの者の代表者のすべてに送信されます。私はこれを行うことができました唯一の方法があるような何かます:
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:よう:
のsendMessage:aSelector withArguments:ArgumentListは
代表者が行います。[:デル| デル行いますaSelector withArguments::。は、ArgumentList]
あなたは引数として、実際のオブジェクトを使用して、任意の複雑なメッセージを転送することができるだろう。
|引数|
引数:=配列 :新しいオブジェクト :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 ] .
(これらはシンコムのVisualWorksからです)。 また、次のメッセージのいずれかを使用すると、あなたのために働くことができるかどうかを確認するために見てみたいことがあります
update:
update:with:
update:with:from:
なぜ単につまり、それぞれのクラスでこのメソッドを実装するには、あなたが呼び出しているオブジェクトを、多型を使わないのでしょうか?次に、あなただけの代表者すべてのサブオブジェクトへの呼び出しと同じ名前を使用してオブジェクトのメソッドに実装します。ような何かます:
MyObjectClass>>someMethod
subobjects do: [:each | each someMethod]