2010-03-21 7 views
6

Ich versuche folgendes zu erreichen:Groovy Mixin auf Instanz (Dynamic Mixin)

class A { 
    def foo() { "foo" } 
} 

class B { 
    def bar() { "bar" } 
} 

A.mixin B 
def a = new A() 

a.foo() + a.bar() 

mit einem signifikanten Unterschied - ich möchte die mixin auf der Instanz tun:

a.mixin B 

aber dies führt zu

groovy.lang.MissingMethodException: No signature of method: A.mixin() is applicable for argument types: (java.lang.Class) values: [class B] 

gibt es eine Möglichkeit, dies wie in den Groovy Mixins JSR vorgeschlagenen Arbeits zu bekommen?

Antwort

8

Sie können dies tun, da Groovy 1.6

Anruf mixin auf die Instanz Metaklasse wie so:

class A { 
    def foo() { "foo" } 
} 

class B { 
    def bar() { "bar" } 
} 

def a = new A() 
a.metaClass.mixin B 

a.foo() + a.bar() 
+0

Dank viel Tim! Also muss ich ein bisschen warten bis Groovy 1.7.1 ein Teil von Grails ist (lass uns in 1.3 hoffen) ... – david

+1

Ich habe es einfach ausprobiert, und es funktioniert auch in 1.6.3 (was ich glaube, ist die Version von groovy das Grails 1.2 verwendet) :-) –

+1

Ja, diese Funktion wurde in Groovy 1.6 hinzugefügt http://www.infoq.com/articles/groovy-1-6 –