2011-06-21 12 views
8

Sto per avviare un progetto di app Web sociale.Interfacce in Groovy

Mentre stavo progettando le classi, ho deciso di definire interfacce come "commentabili" o "simpatiche" per usarle quando necessario.

Eppure non riuscivo a capire come implementarlo in Groovy, che sono in fase di apprendimento.

L'esempio che segue è dalla documentazione Groovy,

interface X 
{ void f(); void g(int n); void h(String s, int n); } 

x = [ f: {println "f called"} ] as X 
x.f() 
//x.g() // NPE here 

dire che questo è uno dei miei interfacce, e voglio usare una classe chiamata B per implementare questa interfaccia ..

devo solo dì B come X, nel relativo controller?

Come farlo nel livello dominio? Se una classe Z è, diciamo "commentabile", dovrei semplicemente creare una classe di dominio chiamata Comment e dire che Z ha qualche commento? e utilizzare l'interfaccia nel livello controller?

Qual è il modo Groovy per farlo correttamente? Sono un po 'confuso e un piccolo chiarimento sarebbe davvero bello.

Grazie in anticipo

risposta

18

L'esempio si mostra non è quello giusto da utilizzare in sede di attuazione le proprie interfacce. Questo è un modo conveniente per implementare solo parzialmente un'interfaccia. In questo esempio viene implementato solo il metodo f, quindi gli altri falliscono come hai visto. Ciò è utile per i test quando si dispone di un'interfaccia di grandi dimensioni, ma solo alcuni metodi nella classe sotto test, quindi non è necessario implementare l'intera interfaccia.

Per implementare interfacce in Groovy, proprio come in Java:

interface Math { 
    int add(int a, int b) 

    int multiply(int a, int b) 
} 

class SimpleMathImpl implements Math { 
    int add(int a, int b) { 
     a + b 
    } 

    int multiply(int a, int b) { 
     a * b 
    } 
} 
+0

Ne sei sicuro che non ho visto nessun singoli esempi come questo ancora non è sicuro attrezzi parola chiave esiste Groovy – add9

+0

modo per quanto riguarda la domanda di design se posso definire un'interfaccia come in Java, implementarla nel controller e utilizzare hasMany nel dominio sarebbe una cosa corretta da fare? – add9

+3

C'è poco vantaggio nell'usare le interfacce in Groovy (o Grails) dato che puoi chiamare qualunque metodo tu voglia - Groovy supporta la "digitazione anatra". Alcuni plugin li usano ma molto più come interfacce "marker" senza metodi, e sono solo usati per classificare i tipi in modo da poter controllare "instanceof MyInterface" e agire di conseguenza. Ma a parte questo non c'è davvero alcun motivo per usare le interfacce. –