Pharo Smalltalk - 消息转发,是不是可以截获消息并将其重定向到另一个对象(实例)?
Posted
技术标签:
【中文标题】Pharo Smalltalk - 消息转发,是不是可以截获消息并将其重定向到另一个对象(实例)?【英文标题】:Pharo Smalltalk - Message forwarding, is it possible to intercept a message and redirect it to another Object (instance)?Pharo Smalltalk - 消息转发,是否可以截获消息并将其重定向到另一个对象(实例)? 【发布时间】:2015-01-29 22:19:28 【问题描述】:Pharo Smalltalk - 消息转发,是否可以截取消息并将其重定向到另一个对象(实例)?
在 Objective-C 中有 forwardInvocation: 在抛出异常之前被调用,这样你就可以对你收到的消息做一些事情而一无所知。
Smalltalk 中是否有类似的东西,我可以将消息重定向到代理吗?
【问题讨论】:
你想完成什么?你有一个这样的功能有用的例子吗?您可以按照 Leo 的回答中的说明使用 DNU。但请记住,在绝大多数情况下,您不需要任何“技巧”。 【参考方案1】:Smalltalk 有doesNotUnderstand: aMessage
,它被发送到接收器以代替其他未定义的方法。您可以覆盖它并做任何您想做的事情(例如,将消息转发到另一个对象,将其记录到磁盘,...),例如:
doesNotUnderstand: aMessage
aMessage sendTo: self delegate.
如果您想“拦截”对象上实际定义的消息,您有两种选择:
-
子类化和使用您自己的对象
使用method wrappers 替换允许各种操作(将消息重定向到新接收者、执行消息前和消息后挂钩、阻止执行包装的方法等)的原始方法定义。
【讨论】:
Method Wrapping 的开创性文本是 Brant, John, Brian Foote, Ralph E. Johnson und Don Roberts: Wrappers to the Rescue。读起来很有趣。 Pharo 的实现可以在ObjectProfile's Spy framework 中找到 请记住,使用#doesNotUnderstand
将比简单的消息发送要慢,因为 a) 将首先搜索整个堆栈 b) VM 必须具体化消息对象(当然,两者都不会花费很长时间,但知道这一点很重要)。
你好,我又回到这个话题了,有一些问题。假设我想转发一条符合 Object 协议的消息,这条消息非常基本,因为转发器本身是一个 Object,这意味着我真的不能使用 #doesNotUnderstand,因为它确实理解它。是否可以从比 Object 更基本的类型对重定向器“对象”进行子类化以便能够转发它?
设法找到答案,有一个方法 allMethodsInCategory: 在 Pharo 3.0 中已被弃用,后来支持 allSelectorsInProtocol: 做我想要的。将此添加到答案中,我会接受它,它非常详细,所以谢谢!看这里:***.com/questions/32422955/… 其他一些方言有methodInProtocol:都一样。以上是关于Pharo Smalltalk - 消息转发,是不是可以截获消息并将其重定向到另一个对象(实例)?的主要内容,如果未能解决你的问题,请参考以下文章
Pharo Smalltalk LinkedList 可能异常
如何确定方法是不是在 Smalltalk 中对象的祖先类中定义