Can Groovy Closure Extend Abstract Class

I have an abstract Java class that must have one onMessage method to implement. I know that closing can easily implement the Java interface using the as keyword, but how can it extend the abstract Java class?

If he cannot expand it, then what is the best possible job in such cases at Groovy?

Here is my use in Java, I am looking for something similar that can be done in Groovy.

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

If the message callback is my abstract class that I would like to use in a similar way in Groovy.

+7
source share
3 answers

I believe you should do this:

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

Does it work?

Edit

To make a call from the Map method back to the Abstract class, the only way to find it is

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

Yo can do this:

Implements a method in any class:

 public MessageTest messageTest(Closure callback) { return new MessageTest() { @Override public void onMessage(Message message) { callback.call(message) } } } 

In the main class in the main method:

 def outerMessage MessageTest messageTest = messageTest() {message -> outerMessage = message println "innerMessage: $message" } messageTest.onMessage("This is the message...") println "outerMessage: $outerMessage" 

Your conclusion should show this:

 innerMessage: This is the message... outerMessage: This is the message... 
+2
source

Based on @tim_yates, here is a version of the method that creates an abstract class object from a closure. I needed something like this to create an instance of such an object in only one line.

 // 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' ) 
+1
source

All Articles