【问题标题】:Set and Get the class field(s) using Delegate in Kotlin在 Kotlin 中使用 Delegate 设置和获取类字段
【发布时间】:2018-11-29 18:11:14
【问题描述】:

如何将 Delegate 用于类字段 getter 和 setter?尝试在 Kotlin 中设置和获取字段(在获取和设置时可能需要执行更多操作)。

import kotlin.reflect.KProperty

class Example {
    var p: String by Delegate()

    override fun toString(): String {
        return "toString:" + p
    }
}

class Delegate() {
    operator fun getValue(thisRef: Any?, prop: KProperty<*>): String {
        //Something like this :prop.get(thisRef)
       return "value"
    }

    operator fun setValue(thisRef: Any?, prop: KProperty<*>, value: String) {

        //something like this : prop.set(thisRef, value)
    }
}

fun main(args: Array<String>) {
    val e = Example()
    println(e.p)//blank output
    e.p = "NEW"
    println(e.p)//NEW should be the output
}

教程:https://try.kotlinlang.org/#/Examples/Delegated%20properties/Custom%20delegate/Custom%20delegate.kt

【问题讨论】:

    标签: kotlin delegation


    【解决方案1】:

    默认情况下,您不会获得委托值的支持字段,因为它可能不存储实际值,或者它可能存储许多不同的值。如果你想在这里存储一个String,你可以在你的委托中为它创建一个属性:

    class Delegate {
        private var myValue: String = ""
    
        operator fun getValue(thisRef: Any?, prop: KProperty<*>): String {
            return myValue
        }
    
        operator fun setValue(thisRef: Any?, prop: KProperty<*>, value: String) {
            myValue = value
        }
    }
    

    【讨论】:

    • 这是否意味着,委托不能重复用于不同的属性?实际上,我在想我们不需要在 Delegate 类中创建单独的字段来设置/获取委托类的属性。我没有得到的是,对于这些情况,我应该为 getValue()/setValue() 函数提供什么实现?
    • 是的,多个属性不应该由同一个委托实例支持。如何在内部实现委托取决于您。它可以将值存储在自己的私有属性中,可以将它们存储在某个服务器上,每次访问时它都可以返回常量或随机值。该语言没有规定任何实现,它只是使您能够使用简单的语法读取和写入存储在委托中的值,就像它们在常规属性中一样。
    • 好的。因此,在我发布的示例中,如果我希望 "e.p = "NEW" 反映在 println(e.p) 上,我需要在 PropDelegate 中有字符串字段并设置和获取该字段。这种理解正确吗?
    • 这是正确的,这就是我的答案中的实现。
    • 太好了,明白了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多