Sobrescrição de membro privado: Closures vs Médodos
24/11/2010 00:00
0
Surgiu hoje esse código na lista do ESJUG. Qual a explicação?


class Pai {
private def imprime = { println "sou papai" }
def fala = { imprime() }
}

class Filho extends Pai {
def imprime = { println "sou filho" }
}

new Filho().fala()

Imprime: "sou papai"


class Pai {
private void imprime() { println "sou papai" }
void fala() { imprime() }
}

class Filho extends Pai {
void imprime() { println "sou filho" }
}

new Filho().fala()

Imprime: "sou filho"
Tags: Groovy


0
Cara,

Boa pergunta!

Eu nao sei a resposta, mas acredito que tenha a ver com o fato de que cada closure, quando compilada para java, vira uma classe diferente. E quando vc define um método na classe filho, ela deve de alguma maneira sobrepor a definição da closure na classe pai.
Acredito que métodos tem precedência em relação a closures.

Fiquei curioso agora para saber a verdade.
25/11/2010 00:00


0
Lembrei de uma coisa, existe uma opção no groovy que você usa para gerar os fontes java a partir de classes groovy. Eu já li a respeito disso mas não sei como é. Talvez ajude a solucionar o caso.
25/11/2010 00:00


0
Bom dia, fiz um teste aqui e o resultado foi o seguinte:
class Pai {
private def imprime = { println "sou papai" }
def fala = { imprime() }
}

class Filho extends Pai {
def imprime = { println "sou filho" }
}

def f = new Filho()
f.fala()
f.imprime()

println '*********'

class Pai1 {
private void imprime() { println "sou papai" }
void fala() { imprime() }
}

class Filho1 extends Pai1 {
void imprime() { println "sou filho" }
}

def f1 = new Filho1()
f1.fala()
f1.imprime()
==>
sou filho
sou filho
*********
sou papai
sou filho

Ou seja com closure você consegue alterar o comportamento de uma closure private da classe pai, e um método private não. Tente fazer isso com métodos públicos, os resultados são iguais. Estou com pouco tempo pra dar uma olhada na documentação pra ter uma explicação "teórica", mas acho que é nessa linha de modificadores de acesso...
Abraço
25/11/2010 00:00


0
Eu recebi uma resposta sobre isso no Groovy Web Console:

<!-- m --><a class="postlink" href="http://groovyconsole.appspot.com/script/333001">http://groovyconsole.appspot.com/script/333001</a><!-- m -->
25/11/2010 00:00



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto