2009-05-20 9 views
2

Я создал класс, и в этом классе у меня есть метод 'sendMessage: to: withArgs:', который получает объект, сообщение и массив аргументов. Метод используется для отправки сообщений объекту и выполнения некоторого алгоритма. Чтобы использовать этот метод, мне нужно создать экземпляр x из созданного мной класса и сделать что-то вроде x sendMessage: '+' to: '7' withArgs: '# (5)'. Результат отправки сообщения «+» объекту 7 с параметром 5 плюс некоторые вещи, которые мой алгоритм делает. Но я хочу, чтобы алгоритм использовался в каждом вызове метода, то есть 7 + 5 будет называть мое «sendMessage: to: withArgs:». Как я могу это сделать? Или, по крайней мере, есть ли что-то, вызываемое в каждом методе, отправленном каждому объекту?В Squeak, как обернуть каждый метод отправки?

ответ

2

Это забавно, мы просто обсуждали это в канале Squeak irc. Возможно, загляните в ObjectViewer.

В вашем примере вы хотите перехватить отправку сообщений в SmallInteger. Как ни странно, ObjectViewer работает с каждым классом BUT SmallInteger.

Итак, чтобы перехватить сообщения, отправленные в myObject, сделайте это.

Создайте класс Intercepter, пусть он наследует от ObjectTracer, возможно. Изменение doesNotUnderstand к чему-то, что служит вам:

doesNotUnderstand: aMessage 
    "do Mojo to aMessage as you describe it" 

Затем, чтобы получить ваш материал собирается, создать свой Intercepter:

myIntercepter := Intercepter on: myObject. 

И затем

myObject become: myInterceptor. 
2

В Squeak см. Класс ObjectTracer. Комментарий к классу описывает, как его использовать. Вы должны иметь возможность выполнить то, что вам нужно, или, по крайней мере, использовать это в качестве модели.

1

Вы можете использовать метод оберток. Чтобы узнать, какие методы обертывают, вы можете найти документ под названием «Упаковщики на помощь». Я думаю, что есть пакет для скрипа, который уже реализует обертки методов. Кроме того, вы можете увидеть, как анализ покрытия тестового кода производится в последней версии Pharo, поскольку он использует своего рода оболочку метода, чтобы увидеть, какие методы оцениваются во время тестового прогона. ура, Габото

2

Посмотрите на the Reflectivity.

К сожалению, некоторые из ссылок на бумагу не работают, и я не помню точного вызова с верхней части головы, но это действительно легко сделать код инструмента, как вы хотите, и даже сделать это во время выполнения. Ищите примеры, используя класс Link.