Установить делегат MethodClosure в Groovy - PullRequest
3 голосов
/ 10 августа 2011

Я сейчас экспериментирую с замыканиями Groovy и делегатами.У меня есть следующий код, устанавливающий делегат замыкания в другой класс, который прекрасно работает.

def closure = {
    newMethod()
};
closure.setDelegate(new MyDelegate());
closure.setResolveStrategy(Closure.DELEGATE_ONLY);
closure();

class MyDelegate {
    public void newMethod() {
        println "new Method";
    }
}

Это печатает «новый метод», показывая, что newMethod () в MyDelegate фактически вызывается.Теперь я пытаюсь сделать то же самое с MethodClosure.

public class TestClass {
    public void method() {
        newMethod();
    }
}

TestClass a = new TestClass();
def methodClosure = a.&method;
methodClosure.setDelegate(new MyDelegate());
methodClosure.setResolveStrategy(Closure.DELEGATE_ONLY);
methodClosure();

class MyDelegate {
    public void newMethod() {
        println "new Method";
    }
}

Однако на этот раз я получаю следующее исключение: Исключение в потоке "main" groovy.lang.MissingMethodException: Нет подписи метода: TestClass.newMethod () применим для типов аргументов: () values: [].

Так что для этого methodClosure не похоже, что он вообще собирается делегату для поиска метода.У меня такое ощущение, что это, вероятно, предполагаемое поведение, но есть ли способы использовать делегатов для MethodClosures?

Большое спасибо.

1 Ответ

1 голос
/ 10 августа 2011

MethodClosures на самом деле являются просто адаптерами для вызова методов через интерфейс Closure.Как вы видели, он не выполняет делегирование.

Один из способов использовать MyDelegate в качестве делегата - это смешать его, например:

TestClass a = new TestClass()
a.metaClass.mixin MyDelegate
def methodClosure = a.&method
methodClosure()

// or skip the closure altogether
TestClass b = new TestClass()
b.metaClass.mixin MyDelegate
b.method()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...