我创建了一个类,在该类中我有一个方法'sendMessage:to:withArgs:',它接收一个对象,一个消息和一个参数数组。 该方法用于向对象发送消息并执行某些算法。 要使用此方法,我必须创建我创建的类的实例x,并执行类似x sendMessage的操作:'+'到:'7'withArgs:'#(5)'。 这将使用参数5向对象7发送消息“+”,以及我的算法所做的一些事情。但我想要的是该算法将在每个方法调用中使用,这意味着7 + 5将调用我的'sendMessage:to:withArgs:'。 我怎样才能做到这一点?或者至少,每个方法中是否有调用的东西发送到每个对象?
答案 0 :(得分:2)
在Squeak中,请参阅ObjectTracer类。类注释描述了如何使用它。你应该能够用它完成你所需要的,或者至少将它作为模型使用。
答案 1 :(得分:2)
有点好笑,我们只是在Squeak irc频道讨论这个问题。也许可以看一下ObjectViewer。
在您的示例中,您希望拦截发送到SmallInteger的消息。有趣的是,ObjectViewer非常适用于每个类但都是SmallInteger。
因此,要拦截消息发送到myObject,请执行此操作。
创建类Intercepter,让它继承ObjectTracer。将doNotUnderstand更改为为您服务的东西:
doesNotUnderstand: aMessage
"do Mojo to aMessage as you describe it"
然后,为了让你的东西继续下去,创建你的Intercepter:
myIntercepter := Intercepter on: myObject.
然后
myObject become: myInterceptor.
答案 2 :(得分:2)
不幸的是,有些纸质链接无法正常工作,我不记得从头顶开始的确切调用,但是根据需要设置代码非常容易,甚至可以在运行时进行。使用类Link
查找示例。
答案 3 :(得分:1)
您可以使用方法包装器。要查看包装器的方法,您可以查找一篇名为“救援包装”的论文。我认为有一个squeak包已经实现了方法包装器。 此外,您还可以看到在Pharo的最新版本中如何进行测试代码覆盖率分析,因为它使用一种方法包装器来查看在测试运行期间评估的方法。 干杯, Gaboto