4

groovy には、単一のクロージャーで Interface を実装するイディオムがあります。クロージャーは、渡された引数を処理できるように準備する必要があります。それはうまくいきます。しかし、インターフェイスで呼び出されたメソッドをどのように判断するのでしょうか?

interface X
{ void f(); void g(int n); void h(String s, int n); }

x = {Object[] args -> println "method called with $args"} as X
x.f()

引数は利用可能ですが、呼び出されたメソッドの名前は - どうやら - ではありません。何か不足していますか?

4

3 に答える 3

12

Michael Borgwardt は本質的に正しいと思います。中かっこ構文を介して提供する実装は、すべてのインターフェイス定義に使用される 1 つのメソッド実装を提供します。

interface X { void f(); void g(int n); void h(String s, int n); }
x = {Object[] args -> println "method called with $args"} as X

x.f()
x.g(5)
x.h("a string",2)

メソッドごとにメソッドを実装してクロージャーを作成する場合は、次の代替構文を使用します。

interface X
{ void f(); void g(int n); void h(String s, int n); }

x = [
        f: {println "f is called"},
        g: {int i-> println "g is called with param ${i}"},
        h: {Object[] args -> println "h is called with ${args}"}
] as X

x.f()
x.g(5)
x.h("a string",2)

詳細については、次を参照してください。

于 2010-03-09T15:26:20.187 に答える
1

この Excample http://groovy.codehaus.org/Using+methodMissing+and+propertyMissingに示すように、動的な MethodMissing 機能を使用できます。

これにより、インターフェイス メソッドの呼び出しを処理できるフォールバック メソッドを実装できます。

于 2009-05-04T16:45:19.047 に答える