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

Pharo Smalltalk - Message forwarding, is it possible to intercept a message and redirect it to another Object (instance)?

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

在 Objective-C 中有 forwardInvocation:它在抛出异常之前被调用,因此您可以对收到的消息做一些事情,而您对此一无所知。

Smalltalk 中是否有类似的东西,我可以将消息重定向到委托吗?

Smalltalk 有 doesNotUnderstand: aMessage,它被发送到接收方以代替其他未定义的方法。你可以覆盖它并做任何你想做的事情(例如将消息转发到另一个对象,将其记录到磁盘,...),例如:

doesNotUnderstand: aMessage 
    aMessage sendTo: self delegate.

如果你想 "intercept" 实际定义在一个对象上的消息,你有两个选择:

  1. 子类化并使用您自己的对象
  2. 使用method wrappers替换原来的方法定义,它允许各种操作(将消息重定向到新的接收者,执行pre-和post-message-hooks,防止包装的执行方法等)。