2011-08-17 93 views
7

我有一個抽象Java類,需要實現一個方法onMessage。我知道閉包可以使用關鍵字as輕鬆實現Java接口,但它如何擴展抽象Java類?Groovy closure是否可以擴展抽象類

如果它不能擴展它,那麼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只有一個方法,你可以這樣做:def callback = {message - > doSomething()}作爲MessageCallback – 2011-08-17 12:11:39

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" 

輸出應該表明這一點:

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

上@tim_yates基礎,這裏有方法的版本,它從創建一個抽象類的對象關閉。我需要類似的東西,能夠在一行中實例化這樣的對象。

// 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')