gpt4 book ai didi

oop - Smalltalk 中的消息转发

转载 作者:行者123 更新时间:2023-12-04 14:14:23 26 4
gpt4 key购买 nike

所以我正在编写一个应用程序,其中一个对象有一堆将消息转发到的委托(delegate)对象。这个想法是我可以说

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

最佳答案

由于您想将对象作为参数传递,因此您必须将它们作为使用消息模式的单独列表传递,如下所示:

someObject sendMessage: aSelector withArguments: argumentList



然后你会实现 #sendMessage:withArguments: 为:

sendMessage: aSelector withArguments: argumentList

delegates do:[:del | del perform: aSelector withArguments: :argumentList].



并且您可以使用真实对象作为参数转发任意复杂的消息:

| arguments |

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

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



我认为这也适用于大多数方言......

关于oop - Smalltalk 中的消息转发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/884350/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com