Smalltalk 在Squeak中,如何包装每个方法发送?

Smalltalk 在Squeak中,如何包装每个方法发送?,smalltalk,squeak,object-model,Smalltalk,Squeak,Object Model,我创建了一个类,在该类中有一个方法“sendMessage:to:withArgs:”,它接收一个对象、一条消息和一个参数数组。 该方法用于向对象发送消息并执行某些算法。 要使用此方法,我必须创建我创建的类的实例x,并执行类似于x sendMessage:“+”到带有args:“#(5)”的“7”的操作。 将消息“+”发送到带有参数5的对象7的结果,以及我的算法所做的一些事情。但我想要的是,算法将在每个方法调用中使用,这意味着7+5将调用我的“sendMessage:to:withArgs:”。

我创建了一个类,在该类中有一个方法“sendMessage:to:withArgs:”,它接收一个对象、一条消息和一个参数数组。 该方法用于向对象发送消息并执行某些算法。 要使用此方法,我必须创建我创建的类的实例x,并执行类似于x sendMessage:“+”到带有args:“#(5)”的“7”的操作。 将消息“+”发送到带有参数5的对象7的结果,以及我的算法所做的一些事情。但我想要的是,算法将在每个方法调用中使用,这意味着7+5将调用我的“sendMessage:to:withArgs:”。
我该怎么做?或者至少,发送到每个对象的每个方法中是否都调用了某个对象?

在Squeak中,请参见类ObjectTracer。类注释描述了如何使用它。你应该能够用它完成你所需要的,或者至少用它作为一个模型。

这有点有趣,我们刚刚在Squeak irc频道讨论过。或许可以看看ObjectViewer

在您的示例中,您希望截获发送到SmallInteger的消息。有趣的是,ObjectViewer可以处理除SmallInteger之外的所有类

所以,要截获发送到myObject的消息,请执行以下操作

创建类拦截器,也许让它从ObjectTracer继承。改变并不意味着服务于你:

doesNotUnderstand: aMessage
   "do Mojo to aMessage as you describe it"
然后,为了让你的东西运行起来,创建你的拦截器:

myIntercepter := Intercepter on: myObject.
然后

myObject become: myInterceptor.

您可以使用方法包装器。要了解wrappers是什么方法,您可以查找一篇名为“wrappers To the rescue”的文章。我认为有一个squeak包已经实现了方法包装器。 此外,您可以看到在Pharo的最新版本中如何进行测试代码覆盖率分析,因为它使用一种方法包装器来查看在测试运行期间评估哪些方法。 干杯 加博托

看看

不幸的是,一些纸上的链接不起作用,我也记不起确切的调用,但是按照您的需要插入代码,甚至在运行时执行,确实很容易。使用class
Link
查找示例