Что здесь делает Groovy?

Я пытался отладить некоторый код, который использует миксины, и мне удалось свести свою проблему к этому примеру. У меня есть родительский класс, который получает методы через миксин, и дочерний класс, который наследуется от родителя. Если я попытаюсь заменить метод в экземпляре дочернего класса, он будет работать БЕЗ метод, который я заменяю, был вызван в экземпляре родительского класса перед его заменой. Если он был вызван, я не могу его заменить

Итак, этот код:

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

9
задан mfollett 1 March 2012 в 22:42
поделиться