kotlin - 这在 kotlin 接口委托中
问题描述
this
使用接口委托时有什么方法可以通过吗?这将实现很好的可组合性——但我发现没有办法做到这一点。意味着类似:
interface Foo {
}
class FooImpl(bar: Bar) : Foo {
}
class Bar: Foo by FooImpl(this) {
}
只要 FooImpl 不需要这样的参数,它就可以工作-但是访问那里的另一个类会很棒-也许有人知道一种方法。否则,我也会感兴趣,如果不值得 KEEP - 或者由于某种原因这将是不可能的。
解决方案
委托不支持这一点。委托必须在委托给它的类之前实例化,因此委托不能依赖它进行构造。另一个问题是,尽管您可以覆盖委托的函数,但如果委托在内部调用这些函数,它将调用原始版本,而不是覆盖。代表真的活在自己的世界里。
但是您可以将其设置为主机在其初始化块中将自身传递给委托:
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()
}
不幸的是,这会使主机暴露于外部类与其自己的委托断开连接的可能性。如果多次分配,也许您可以使该属性引发异常。
这是一个可以做到这一点的属性委托:
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()
推荐阅读
- swift - 为什么这个脉动动画会移动 x 和 y 位置?
- java - 设计编辑器在项目同步成功之前不可用
- javascript - 启动 jquery 函数时出现 componentDidMount() 问题 - React
- node.js - 如何创建一个 Node.js 服务,在请求时下载页面内容并返回结果?
- python - Pandas - 每个周期后重置 CUMSUM
- rest - Sharepoint RequestDigest 被解释为 cURL 中的参数
- python - 无法使用 docker 容器运行 django 应用程序
- java - 多次从方法返回值
- azure-functions - 我无法在我的天蓝色函数和 APIM 中添加路径参数
- java - 编写程序,将输入行读取为字符串并打印字符串中所有元音的位置