Estaba intentando depurar algún código que usa mixins y pude reducir mi problema a este ejemplo. Tengo una clase para padres que recibe métodos a través de mixin y una clase hija que hereda del padre. Si trato de reemplazar un método en una instancia de la clase hija funciona A MENOS QUE se invocó el método que estoy reemplazando en una instancia de la clase padre antes de que se sustituya. Si se le ha llamado, entonces no puedo reemplazarlo¿Qué está haciendo Groovy aquí?
lo que este código:
class M {
protected foo() { println 'foo' }
}
@Mixin(M) class A {
def bar() { foo() }
}
class B extends A {}
def b = new B()
def a = new A()
a.bar() //<-- comment out this line and see the difference
b.metaClass.foo = {println 'winning'}
b.bar()
cederá:
foo
foo
Pero si Si comentas la línea 13 (la que tiene el comentario que dice que debes comentarla) obtendrás:
ganar
¿Por qué sucede esto? Espero que esto tenga sentido en el contexto del modelo de metaclase de Groovy, pero no lo entiendo.
Esto es maravilloso 1.8.6
I también puede reproducir esto en Groovy 1.8.4. Huele como un error para mí; pero no estoy demasiado metido en la metaprogramación de Groovy, así que no sé. – epidemian
Gracias por la nota, me aseguraré de incluir eso si termino archivando un error en él. – mfollett
Preguntaría esto en la lista de correo de usuarios maravillosos, huele como un error para mí ... –