Я пытался отладить некоторый код, который использует миксины, и мне удалось свести свою проблему к этому примеру. У меня есть родительский класс, который получает методы через миксин, и дочерний класс, который наследуется от родителя. Если я попытаюсь заменить метод в экземпляре дочернего класса, он будет работать БЕЗ метод, который я заменяю, был вызван в экземпляре родительского класса перед его заменой. Если он был вызван, я не могу его заменить
Итак, этот код:
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()
даст:
foo
foo
Но если вы закомментируете строку 13 (ту, которая содержит комментарий, говорит, чтобы прокомментировать это) вы получите:
выигрыш
Почему это происходит? Я полагаю, что это имеет смысл в контексте модели метакласса Groovy, но я этого не понимаю.
Это Groovy 1.8.6