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

时间:2009-05-20 16:17:44

标签: smalltalk squeak object-model

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

4 个答案:

答案 0 :(得分:2)

查看the Reflectivity

不幸的是,有些纸质链接无法正常工作,我不记得从头顶开始的确切调用,但是根据需要设置代码非常容易,甚至可以在运行时进行。使用类Link查找示例。

答案 1 :(得分:2)

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

答案 2 :(得分: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.

答案 3 :(得分:1)

您可以使用方法包装器。要查看包装器的方法,您可以查找一篇名为“救援包装”的论文。我认为有一个squeak包已经实现了方法包装器。 此外,您还可以看到在Pharo的最新版本中如何进行测试代码覆盖率分析,因为它使用一种方法包装器来查看在测试运行期间评估的方法。 干杯, Gaboto