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

标签 kotlin interface delegation

有没有办法通过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/

相关文章:

android - 为什么可为空的数字不保留身份?

Kotlin闭包解决逻辑和操作

java - 没有实例的最终常量类如何比常量接口(interface)更好?

iOS - 当我有助手类时,是否需要 UITableViewCell 委托(delegate)?

ios - 从自定义 TableViewCell 中重新加载 TableView

java - 找不到 androidx.camera :camera-view

android - 无法在Firebase数据库的userid文件夹内创建新路径

java - 我应该使用这样的界面吗?

typescript - 在另一个接口(interface)中使用 Typescript 接口(interface)的一个属性

iOS:将数据传递给另一个类