Pharo Smalltalk-消息转发,是否可以拦截消息并将其重定向到另一个对象(实例)?

Pharo Smalltalk-消息转发,是否可以拦截消息并将其重定向到另一个对象(实例)?,smalltalk,pharo,Smalltalk,Pharo,Pharo Smalltalk-消息转发,是否可以拦截消息并将其重定向到另一个对象(实例) 在Objective-C中有forwardInvocation:它在抛出异常之前被调用,这样您就可以对收到的消息做些什么,而对它一无所知 Smalltalk中是否有类似的内容?我可以将消息重定向到代理吗?Smalltalk具有doesNotUnderstand:aMessage,它被发送到接收者,以代替其他未定义的方法。您可以覆盖它并执行任何您想要的操作(例如,将消息转发到另一个对象,将其记录到磁盘,…)

Pharo Smalltalk-消息转发,是否可以拦截消息并将其重定向到另一个对象(实例)

在Objective-C中有forwardInvocation:它在抛出异常之前被调用,这样您就可以对收到的消息做些什么,而对它一无所知


Smalltalk中是否有类似的内容?我可以将消息重定向到代理吗?

Smalltalk具有
doesNotUnderstand:aMessage
,它被发送到接收者,以代替其他未定义的方法。您可以覆盖它并执行任何您想要的操作(例如,将消息转发到另一个对象,将其记录到磁盘,…),例如:

doesNotUnderstand: aMessage 
    aMessage sendTo: self delegate.
如果要“截获”对象上实际定义的消息,有两个选项:

  • 子类化和使用您自己的对象
  • 用于替换允许各种操作的原始方法定义(将消息重定向到新接收者、执行消息前和消息后挂钩、防止执行包装方法等)

  • 你想完成什么?你有这样一个功能有用的例子吗?您可以使用DNU,正如Leo在回答中所解释的那样。但是请记住,在绝大多数情况下,你不应该需要任何形式的“把戏”。读起来很有趣。Pharo实现可以在中找到,请记住,使用
    #doesNotUnderstand
    比简单的消息发送要慢,因为A)首先搜索整个堆栈,b)VM必须具体化消息对象(当然,两者都不会花费很长时间,但重要的是要知道)。您好,我又回到了这个主题,有一些问题。假设我想要转发一条符合对象协议的消息,该消息非常基本,因为转发器本身就是一个对象,这意味着我真的无法使用#doesNotUnderstand,因为它确实理解它。是否可以将重定向器“object”从比object更基本的类型子类化以转发它?为了找到答案,有一种方法allMethodsInCategory:在Pharo 3.0中被弃用,后来被支持allSelectorsInProtocol:这正是我想要的。将此添加到答案中,我会接受它,它非常详细,所以谢谢!请看这里:其他一些方言也有同样的方法。