2010-03-21 22 views
6

Próbuję osiągnąć następujące:Groovy wstawką Instancji (Dynamic Mixin)

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

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

A.mixin B 
def a = new A() 

a.foo() + a.bar() 

z jedną istotną różnicą - Chciałbym zrobić wstawek na przykład:

a.mixin B 

ale skutkuje to

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

Czy istnieje sposób, aby uzyskać to działa jak zaproponowano w Groovy Mixins JSR?

Odpowiedz

8

Można to zrobić ponieważ Groovy 1.6

połączeń wstawką metaklasą przykład tak:

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

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

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

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

Bardzo dziękuję Tim! Tak więc muszę trochę poczekać, aż Groovy 1.7.1 jest częścią Grails (miejmy nadzieję, że w 1.3) ... – david

+1

Po prostu wypróbowałem to i działa również w 1.6.3 (co uważam za wersję groovy, która Grails 1.2 używa) :-) –

+1

Tak, ta funkcja została dodana w Groovy 1.6 http://www.infoq.com/articles/groovy-1-6 –