Pharo Smalltalk - 消息转发,是否可以拦截消息并将其重定向到另一个对象(实例)?
在 Objective-C 中有一个 forwardInvocation:它在抛出异常之前被调用,这样你就可以对收到的消息做一些事情,而对它一无所知。
Smalltalk 中是否有类似的东西,我可以将消息重定向到代表吗?
Smalltalk有doesNotUnderstand: aMessage
它被发送到接收者,而不是一个未定义的方法。您可以覆盖它并执行任何您想要的操作(例如,将消息转发到另一个对象,将其记录到磁盘等),例如:
doesNotUnderstand: aMessage
aMessage sendTo: self delegate.
如果要"截获"对象上实际定义的消息,则有两种选择:
- 子类化和使用自己的对象 使用方法包装
- 器替换原始方法定义,它允许各种操作(将消息重定向到新的接收器,执行消息前和消息后钩子,阻止包装方法的执行等)。