2011-08-17 21 views
7

抽象Javaクラスを実装するには、一つのメソッドonMessageを実装する必要があります。私はクロージャがasキーワードを使ってJavaインターフェイスを簡単に実装できることを知っていますが、どのように抽象Javaクラスを拡張できますか?Groovyクロージャが抽象クラスを継承できるか

もしそれを拡張できないのなら、Groovyの場合に可能な限り最善の解決策はありますか?

これはJavaの私の使い方ですが、私はGroovyで行うことができる同様のものを探しています。

MessageCallback callback = new MessageCallback() { 
      @Override 
      public void onMessage(Message message) { 
       dosomething(); 
      } 
     }; 

メッセージコールバックは、Groovyで同様の方法で使用したい抽象クラスです。

答えて

7

私はあなたが行うことができるはずと信じて:

def callback = [ onMessage:{ message -> doSomething() } ] as MessageCallback 

は動作しないことにしていますか?

編集

バック抽象クラスにマップする方法から電話をかけるために、私はそれを行うには見つけることができる唯一の方法は次のとおりです。

// Dummy class for testing 
abstract class MessageTest { 
    abstract void onMessage(msg) ; 
    void done() { println "DONE!" } 
} 

// Create a Proxied instance of our class, with an empty onMessage method 
def p = [ onMessage:{ msg -> } ] as MessageTest 

// Then overwrite the method once we have access to the Proxy object p 
p.metaClass.onMessage = { msg -> println msg ; p.done() } 

// Test 
p.onMessage('woo') 
+2

これでうまくいくはずです。実際、MessageCallbackには1つのメソッドしかない場合は、次のようにしてください:def callback = {message - > doSomething()} MessageCallbackとして –

+0

@tim_yates messagecallbackクラスはメソッドが "done"閉包、私は欠落しているメソッドの例外があります。 Javaでは、私はdone()を使うだけで、Groovyで他の構文を使うべきですか? – Abe

+1

ああ、Proxiedのクラスに戻ってくる必要があるのであれば、扱いにくいです...私は見て、空のメソッドを使って具象クラスを作成し、私が現在考えることができる唯一の他の解決策である「metaClass」 –

2

ヨこれを行うことができます。

は、任意のクラスのメソッドを実装します:

public MessageTest messageTest(Closure callback) { 
    return new MessageTest() { 
     @Override 
     public void onMessage(Message message) { 
      callback.call(message) 
     } 
    } 
} 
mainメソッドの主なクラスで

この示すべきであるあなたの出力

def outerMessage 

MessageTest messageTest = messageTest() {message -> 
    outerMessage = message 
    println "innerMessage: $message" 
} 

messageTest.onMessage("This is the message...") 
println "outerMessage: $outerMessage" 
:@tim_yatesの

innerMessage: This is the message... 
outerMessage: This is the message... 
1

ベイシングは、ここから抽象クラスのオブジェクトを作成する方法のバージョンがあります閉鎖。私はそのようなオブジェクトをただ一つの行にインスタンス化できるようにするために、何かが必要でした。

// Dummy class for testing 
abstract class MessageTest { 
    abstract void onMessage(msg) ; 
    void done() { println "DONE!" } 
} 

MessageTest createMessageTest(Closure closure) { 
    // Create a Proxied instance of our class, with an empty onMessage method 
    def p = [ onMessage:{ msg -> } ] as MessageTest 

    // Then overwrite the method once we have access to the Proxy object p 
    p.metaClass.onMessage = closure 
    return p 
} 

// Create 
MessageTest mt = createMessageTest { msg -> 
    println msg ; 
    done() 
} 

// Test 
mt.onMessage('woo') 
関連する問題