gpt4 book ai didi

kotlin - 如何将实现委托(delegate)给 Kotlin 中的属性?

转载 作者:IT老高 更新时间:2023-10-28 13:30:16 25 4
gpt4 key购买 nike

Kotlin 使我能够通过委托(delegate)给主构造函数参数来实现接口(interface),如下所示:

class Foo(xs : ArrayList<Int>) : List<Int> by xs { }

但这向用户展示了支持实现者。委托(delegate)给匿名似乎也可以:

class Foo() : List<Int> by ArrayList<Int>() { }

这隐藏了实现细节,但我们失去了对接口(interface)未提供的功能的访问权限,在这种情况下是可变性。

因此,我想将实现委托(delegate)给不在主构造函数中的属性。我想要的类似于

class Foo() : List<Int> by xs {
val xs : List<Int> = ArrayList<Int>()
}

无法编译。

是否可以在类主体中明确定义一个属性,并且仍然能够将实现委托(delegate)给它?

最佳答案

目前这是不可能的。 by 子句中的表达式在类的构造之前只计算一次,因此您不能引用该类的符号。

有一个request in the issue tracker允许这样做,尽管 Kotlin 1.0 几乎肯定不会支持它。

有时 起作用的一个有趣的解决方法是,将您想成为委托(delegate)的属性改为具有默认值的构造函数参数。这样它就可以在 by 子句和类主体中访问:

class Foo(val xs: List<Int> = ArrayList<Int>()) : List<Int> by xs {
fun bar() {
println(xs)
}
}

请记住,尽管 by xs 中的 xs 在这里仍然只计算一次,所以即使 xsvar 属性,只会使用构造函数中提供的默认值。这不是一个通用的解决方案,但有时会有所帮助。

关于kotlin - 如何将实现委托(delegate)给 Kotlin 中的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33966186/

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