В Groovy 1.6 был представлен гораздо более простой механизм использования категорий / миксинов. Ранее методы класса категории должны были быть объявлены как статические, а первый параметр указывает, к какому классу объектов они могут быть применены (как в вашем классе Foo
выше).
Я нахожу это несколько неловким, потому что как только методы категории «смешиваются» с целевым классом, они становятся нестатичными, но в классе категории они являются статическими.
В любом случае, начиная с Groovy 1.6, вы можете сделать это вместо
// Define the category
class MyCategory {
void doIt() {
println "done"
}
void doIt2() {
println "done2"
}
}
// Mix the category into the target class
@Mixin (MyCategory)
class MyClass {
void callMixin() {
doIt()
}
}
// Test that it works
def obj = new MyClass()
obj.callMixin()
Доступны несколько других функций. Если вы хотите ограничить классы, к которым может быть применена категория, используйте аннотацию @Category
. Например, если вы хотите применить MyCategory
к MyClass
(или его подклассам), определите его как:
@Category(MyClass)
class MyCategory {
// Implementation omitted
}
Вместо того, чтобы смешивать категории во время компиляции, используя @Mixin
(как указано выше), вы можете смешивать их во время выполнения, вместо этого используя:
MyClass.mixin MyCategory
Если вы используете Grails, Bootstrap.groovy
- это место, где вы можете сделать это.