2011-08-17 91 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')