Kotlin class 委托,将其传递给委托

Kotlin class delegation, passing this to delegate

在kotlin中委托class时是否有可能传递this

class SomeFlow : Flow, SmsAuthentication by DefaultSmsAuthentication(this)

它说 this 在此上下文中不存在。另一个 class 看起来像这样:

class DefaultSmsAuthentication(val flow: Flow) : SmsAuthentication

通过 setter 而不是 constructor 注入 this 怎么样?

例如:

interface SmsAuthentication {

    fun withFlow(flow: Flow)

    fun auth()

}

class DefaultSmsAuthentication() : SmsAuthentication {

    var flow: Flow? = null

    override fun withFlow(flow: Flow) {
        this.flow = flow
    }

    override fun auth() {
        flow?.proceed()
    }

}

class SomeFlow : Flow, SmsAuthentication by DefaultSmsAuthentication() {

    init {
        withFlow(this)
    }

}

但是,您每次都需要在constructor中手动调用withFlow()。你可能忘记调用它了。

您可能希望 SmsAuthentication 作为 属性。所以你只需注入它 by lazy 并在需要时调用它。我认为这是更安全的方式。

class SomeFlow : Flow, SmsAuthentication {

    val auth by lazy { DefaultSmsAuthentication(this) }

    override fun auth() {
        auth.auth()
    }

}

你也可以应用Decorator模式,反之:

class DefaultSmsAuthenticationFlow(val flow: Flow) :
    SmsAuthentication,
    Flow by flow
{
    override fun auth() {
        // you can use flow as this here
    }
}

fun doAuth(flow: Flow) {
    DefaultSmsAuthenticationFlow(flow).auth()
}