美文网首页
[学习]拥抱kotlin(六)

[学习]拥抱kotlin(六)

作者: 吴敬悦 | 来源:发表于2021-02-10 23:43 被阅读0次

今天看委托模式。
有一篇讲得不错的: 一文彻底搞懂Kotlin中的委托
还有中文官网的教程: 委托属性
还有一篇官方的教程: Kotlin Vocabulary | Kotlin 委托代理

刚开始是不知道这是啥的,像下面的代码:

private val viewmodel: LiveDataViewModel by viewModels { LiveDataVMFactory }

我最看不懂的就是 by ,一头雾水,不知道这里是啥含义,于是便开启了我的学习之旅。
看语法形式:

val/var <属性名>: <类型> by <表达式>

在 by 后面的表达式是该 委托, 因为属性对应的 get()(与 set())会被委托给它的 getValue() 与 setValue() 方法。 属性的委托不必实现任何的接口,但是需要提供一个 getValue() 函数(与 setValue()——对于 var 属性)。

看例子:

import kotlin.reflect.KProperty

class Delegate {
    operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
        return "$thisRef, thank you for delegating '${property.name}' to me!"
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
        println("$value has been assigned to '${property.name}' in $thisRef.")
    }
}
class Test {
    var name: String by Delegate()
}
fun main(args: Array<String>) {
    val test = Test()
    test.name = "100"
    println(test.name)
}
// 输出:
// 100 has been assigned to 'name' in Test@72ea2f77.
// Test@72ea2f77, thank you for delegating 'name' to me!

可以看到要想委托需要实现对应的方法 getValuesetValue 。其中的参数要求:

  • thisRef —— 必须与属性所有者类型(对于扩展属性——指被扩展的类型)相同或者是其超类型。
  • property —— 必须是类型 KProperty<*> 或其超类型。
  • value — 必须与属性类型相同(或者是其超类型)。

其中 thisRef 指的是类,在上面的例子中我编写的是 Any ,所以不受限制,如果我写的是 Int ,那么这里就会失败:

当thisRef不正确时会出现错误
可以看出这里需要的是 TestTest 的超类,当然可以直接写 Any 。既然超类是可以的,那么下面也是可行的:
class Delegate {
    operator fun getValue(thisRef: SupperTest?, property: KProperty<*>): String {
        return "$thisRef, thank you for delegating '${property.name}' to me!"
    }

    operator fun setValue(thisRef: SupperTest?, property: KProperty<*>, value: String) {
        println("$value has been assigned to '${property.name}' in $thisRef.")
    }
}
open class SupperTest
class Test: SupperTest() {
    var name: String by Delegate()
}

相关文章

  • [学习]拥抱kotlin(六)

    今天看委托模式。有一篇讲得不错的: 一文彻底搞懂Kotlin中的委托[https://juejin.cn/post...

  • [学习]拥抱kotlin(七)

    我发现我在平时的使用中,连数组,集合很多我都非常懵逼,明明在 java 或 javascript 中都是很容易的。...

  • [学习]拥抱kotlin(Infix)

    我遇到了 Infix 函数。尽量一个就是一天,下次找的时候方便。 有了这个函数就相当于自己定义了一种操作,跟自定义...

  • [学习]拥抱kotlin(二)

    1. 字符串模版 字符串模版现在很多语言都是支持的,比如说: php 和 js 等等。虽然 java 也可以用,但...

  • [学习]拥抱kotlin(三)

    终于到类了,有一篇文章写得挺好的,Kotlin 里那些「更方便的」[https://kaixue.io/kotli...

  • [学习]拥抱kotlin(一)

    既然选择学习了,那就学习最新的,学习最时髦的;同时也为了兼容 java ,我到时候都尽量把两种都写一写。 1. 通...

  • [学习]拥抱kotlin(五)

    看 码上开学[https://kaixue.io/] 的视频记录。 1. 变量 如果你在写变量的时候是这样的 va...

  • [学习]拥抱kotlin(四)

    接下来的 kotlin 学习的会以我学习 android 所遇到不会的进行学习。今天学习协程。还有扔物线的教程Ko...

  • 【Kotlin学习日记】Day6:控制流程

    大家好,欢迎加入小李君的Kotlin学习之旅。今天是小李君学习 Kotlin 的第六天。 Control Flow...

  • 用Kotlin实现RecyclerView探索

    自从Kotlin被Google钦定后热闹了一阵子,感觉应该拥抱一下互联网,特此记录一下自己的Kotlin学习过程 ...

网友评论

      本文标题:[学习]拥抱kotlin(六)

      本文链接:https://www.haomeiwen.com/subject/sdoxxltx.html