Могут ли Groovy Mixins удовлетворять требованиям абстрактного класса? - PullRequest
0 голосов
/ 18 октября 2011

У меня есть три класса 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, что я делаю не так?

1 Ответ

1 голос
/ 18 октября 2011

Вы не делаете ничего плохого. Проблема заключается в том, что компилятор выполняет эту проверку перед применением преобразований AST. Вам лучше опубликовать это на их трекере проблем на http://jira.codehaus.org/secure/BrowseProject.jspa?id=10242.

Поскольку преобразование @Mixin было фактически создано автором Groovy ++ AFAIK, и поскольку Groovy ++ имеет гораздо более расширенную поддержку категорий, миксинов и признаков, вы можете ожидать, что это будет действительный код. Тебе стоит попробовать это.

...