我试图更好地理解 Smalltalk 中的反射。我正在使用最新版本的 Squeak (v4.3)。我想拦截发送到我的一个类的实例的每条消息。我以为我可以重写该方法ProtoObject>>withArgs:executeMethod
,但 Stéphane Ducasse 向我解释说,出于性能原因,不使用此方法(这是我自己对他的回答的总结)。我应该覆盖哪种方法/如何拦截发送的消息?
这是我尝试的代码:
Object subclass: #C
instanceVariableNames: 'i'
classVariableNames: ''
poolDictionaries: ''
category: 'CSE3009'.
C class compile: 'newWithi: anInt
^(self new) i: anInt ; yourself.'.
C compile: 'withArgs: someArgs executeMethod: aMethod
Transcript show: ''Caught: ''.
^ super withArgs: someArgs executeMethod aMethod.'.
C compile: 'foo: aText
Transcript show: aText.
Transcript show: i.
Transcript cr.'.
C compile: 'i: anInt
i := anInt.'.
o := C newWithi: 42.
o foo: 'This is foo: '.
执行这整段代码会产生:
This is foo: 42
当我想要:
Caught: This is foo: 42