У меня есть три класса Groovy: M, A и B. B существует как смесь M и расширения абстрактного класса A:
class M {
def foo = 11
def bar = 12
}
abstract class A {
abstract foo
}
@Mixin(M)
class B extends A {
}
def b = new B()
print "${b.foo}\n"
print "${b.bar}\n"
Попытка запустить это заставляет Groovy жаловаться на:
Can't have an abstract method in a non-abstract class. The class 'B' must be declared abstract or the method 'void setFoo(java.lang.Object)' must be implemented.
Тем не менее, этот метод реализован в Mixin M.
Кроме того, если я изменю B на:
@Mixin(M)
class B extends A {
def foo = 13
}
Тогда я получаю распечатку:
11
12
А не:
13
12
То, что я ожидаю, и, кажется, доказывает, что M обеспечивает приемлемую реализацию абстрактных методов A.
Итак, почему не в восторге от использования mixin M для удовлетворения абстрактного класса A, что я делаю не так?