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()
}
在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()
}