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

uno*_*nom 2 smalltalk pharo

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

在Objective-C中有forwardInvocation:在抛出异常之前调用它,这样你就可以对你收到的消息做一些事情并且一无所知.

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

Leo*_*Leo 5

Smalltalk doesNotUnderstand: aMessage被发送到接收器而不是其他未定义的方法.您可以覆盖它并执行任何操作(例如,将消息转发到另一个对象,将其记录到磁盘,......),例如:

doesNotUnderstand: aMessage 
    aMessage sendTo: self delegate.
Run Code Online (Sandbox Code Playgroud)

如果要"拦截"实际在对象上定义的消息,则有两个选项:

  1. 继承和使用您自己的对象
  2. 使用方法包装器来替换允许各种操作的原始方法定义(将消息重定向到新接收器,执行消息前挂钩和后挂钩,防止执行包装方法等).

  • 关于_Method Wrapping_的开创性文章是[Brant,John,Brian Foote,Ralph E. Johnson和Don Roberts:_Wrappers to the Rescue_](http://www.laputan.org/pub/foote/brant.pdf).阅读非常有趣.Pharo实现可以在[ObjectProfile的Spy框架]中找到(http://smalltalkhub.com/#!/~ObjectProfile/S2py) (3认同)