当前位置 : 主页 > 手机开发 > 其它 >

继承 – 你如何在交互之前链接?

来源:互联网 收集:自由互联 发布时间:2021-06-19
我有一个继承自具有beforeInterceptor的类的控制器. 这是我的基类. class FooBase { def beforeInterceptor = [action: {parentInterceptor()}] def parentInterceptor() { render("Snarge") }} 这是控制器的版本不起作用.
我有一个继承自具有beforeInterceptor的类的控制器.

这是我的基类.

class FooBase {
    def beforeInterceptor = [action: {parentInterceptor()}]

    def parentInterceptor() {
        render("Snarge")
    }
}

这是控制器的版本不起作用.

class BrokenController extends FooBase
{
    def beforeInterceptor = [action: {childInterceptor()}]

    def childInterceptor() {
        super.beforeInterceptor.action.call()
        render("Bar")
    }

    def index = {
        render("Foo")
    }
}

这是一个有效的版本

class WorkingController extends FooBase
{
    def beforeInterceptor = {
        super.beforeInterceptor.action.call()
        render("Bar")
    }

    def index = {
        render("Foo")
    }
}

当我在WorkingController上调用index时,我得到输出SnargeBarFoo.当我在BrokenController上调用index时,我得到一个IllegalAccessError

我想我有一个有效的版本,所以我的问题更多的是关于这里发生了什么?为什么一个版本可以从子类访问父类,但另一个版本不能?

我正在寻找的用例是能够使用具有除功能的拦截器功能.这需要能够在使用地图实现拦截器时链接拦截器.

两者之间有区别

this.

this.&

以下代码有效 – 检查第三行:

class BrokenController extends FooBase
{
    def beforeInterceptor = [action: {this&childInterceptor()}]

    def childInterceptor() {
        super.beforeInterceptor.action.call()
        render("Bar")
    }

    def index = {
        render("Foo")
    }
}

该文件说明了以下内容.&

Method Reference     .&      Get a reference to a method, can be useful for creating closures from methods

所以我不确定,但我想它调用了该方法的作用域.或许系统会创建某种辅助类,以便执行一个闭包,导致该类没有super.beforeInterceptor方法.

网友评论