Наследование по замыканию не имеет особого смысла (в любом случае, как мы их используем). Закрытие на практике является экземпляром класса Closure
. Если бы мы создали подклассы Closure
, мы могли бы создать их подклассы, но это не так. Например, в контроллерах мы определяем действия как встроенные экземпляры, например
def list = {
...
}
Они обрабатываются как методы, в которых мы можем вызвать list()
, но это просто синтаксический сахар для list.call()
, поскольку call()
- это метод экземпляра класса Closure
.
В Grails 2.0 предпочтительным подходом к созданию действий контроллера является использование методов, хотя для обратной совместимости все еще поддерживаются замыкания. Одной из основных причин этого переключения является поддержка перегрузки и переопределения, что невозможно (или, по крайней мере, практически) при встроенных замыканиях. Вы можете определить экземпляр замыкания в подклассе с тем же именем, что и экземпляр базового класса, но вы не можете вызвать super.list()
, так как это приведет к StackOverflowError