Могут ли Groovy Mixins удовлетворять требованиям абстрактного класса?

У меня есть три класса 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. Однако этот метод реализуется миксином M.

Кроме того, если я изменю B на:

@Mixin(M)
class B extends A {
    def foo = 13
}

Затем я получаю распечатку:

11

12

И не:

13

12

Это то, что я ожидаю и, кажется, доказывает, что M обеспечивает приемлемую реализацию абстрактных методов A.

Итак, почему groovy не устраивает использование примеси M для удовлетворения абстрактного класса A, что я делаю неправильно?


person mfollett    schedule 17.10.2011    source источник
comment
Я не знал, что вам разрешены абстрактные свойства...   -  person tim_yates    schedule 18.10.2011
comment
Насколько я могу судить, это делает абстрактный геттер и сеттер. Я тоже этого не делал, пока один из моих коллег не сделал это.   -  person mfollett    schedule 18.10.2011
comment
Я задал вопрос в классном списке рассылки, так как это не кажется правильным (или действительно полезным) ;-)   -  person tim_yates    schedule 19.10.2011
comment
@tim_yates Хорошо, но его удаление нарушит наш уже существующий код и, возможно, другие. Автор, который сделал это в моем офисе, имел в виду это, так как я собираюсь получить доступ к методам get и set для атрибута с именем «foo», мне все равно, как вы его определяете, но он должен быть там.   -  person mfollett    schedule 19.10.2011


Ответы (1)


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

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

person Nikita Volkov    schedule 17.10.2011
comment
Спасибо, я поставил билет для этого. - person mfollett; 20.10.2011