gpt4 book ai didi

kotlin - 这在 kotlin 接口(interface)委托(delegate)中

转载 作者:行者123 更新时间:2023-12-02 12:40:21 26 4
gpt4 key购买 nike

有没有办法通过this使用接口(interface)委托(delegate)时?这将实现很好的可组合性 - 但我发现没有办法做到这一点。
意味着类似:

interface Foo {
}

class FooImpl(bar: Bar) : Foo {

}

class Bar: Foo by FooImpl(this) {
}

只要 FooImpl 不需要这样的参数,它就可以工作-但是访问那里的另一个类会很棒-也许有人知道一种方法。否则,我也会感兴趣,如果这是否值得 KEEP - 或者由于某种原因这将是不可能的。

最佳答案

委托(delegate)不支持这一点。委托(delegate)必须在委托(delegate)给它的类之前实例化,因此委托(delegate)不能依赖它进行构造。另一个问题是,尽管您可以覆盖委托(delegate)的函数,但如果委托(delegate)在内部调用这些函数,它将调用原始版本,而不是覆盖。代表真的生活在自己的世界里。

但是您可以将其设置为主机在其初始化 block 中将自身传递给委托(delegate):

interface Foo<T> {
var host: T
fun doSomething()
}

class FooImpl : Foo<Bar> {
override lateinit var host: Bar

override fun doSomething() {
println(host.name)
}
}

class Bar(val name: String): Foo<Bar> by FooImpl() {
init {
host = this
}
}

fun main() {
val bar = Bar("Hello world")
bar.doSomething()
}

不幸的是,这会使主机暴露于外部类与其自己的委托(delegate)断开连接的可能性。如果多次分配,也许您可​​以使该属性引发异常。

这是一个可以做到这一点的属性委托(delegate):
private class SingleAssignmentVar<T>: ReadWriteProperty<Any, T> {
private var value: T? = null
private var assigned: Boolean = false

@Suppress("UNCHECKED_CAST")
override fun getValue(thisRef: Any, property: KProperty<*>): T {
if (!assigned)
error("Property has not yet been set.")
return value as T
}

override fun setValue(thisRef: Any, property: KProperty<*>, value: T) {
if (assigned)
error("Property may only be set once.")
assigned = true
this.value = value
}
}

fun <T> Delegates.singleAssignment(): ReadWriteProperty<Any, T> = SingleAssignmentVar()

关于kotlin - 这在 kotlin 接口(interface)委托(delegate)中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61649558/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com