美文网首页Android Kotlinjs css html
Kevin Learn Kotlin:委托

Kevin Learn Kotlin:委托

作者: Kevin_小飞象 | 来源:发表于2022-02-16 08:54 被阅读0次

Kotlin 通过关键字 by 实现委托。

类委托

类的委托即一个类中定义的方法实际是调用另一个类的对象的方法来实现的。

fun main() {
    val b = BaseImpl(20)
    Derived(b).print()
}

// 创建接口
interface Base {
    fun print()
}

// 实现此接口的被委托的类
class BaseImpl(val x: Int) : Base {
    override fun print() {
        print(x)
    }
}

// 通过关键字 by 建立委托类
class Derived(b: Base) : Base by b

输出结果:

20

属性委托

属性委托指的是一个类的某个属性值不是在类中直接进行定义,而是将其托付给一个代理类,从而实现对该类的属性统一管理。

val/var <属性名>: <类型> by <表达式>
  • var/val:属性类型(可变/只读)
  • 属性名:属性名称
  • 类型:属性的数据类型
  • 表达式:委托代理类
fun main() {
    val e = Example()
    println(e.p)

    e.p = "Kevin"
    println(e.p)
}

class Example {
    var p: String by Delegate()
}

// 委托的类
class Delegate {
    operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
        return "$thisRef, 这里委托了 ${property.name} 属性"
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
        println("$thisRef 的 ${property.name} 属性赋值为 $value")
    }
}

输出结果:

Example@246b179d, 这里委托了 p 属性
Example@246b179d 的 p 属性赋值为 Kevin
Example@246b179d, 这里委托了 p 属性

lazy 函数

1. 基本语法

val p by lazy {...}

说明:by 是 kotlin 的关键字,lazy 在这里只是一个高阶函数。在 lazy 函数中会创建并返回一个 Delegate 对象,当我们调用 p 属性的时候,其实调用的是 Delegate 对象的 getValue() 方法。

2. 实现 lazy 函数

  1. 新建 Later.kt 文件,编写如下代码:
class Later<T>(val block:() -> T) {
    var value: Any? = null

    operator fun getValue(any:Any?,prop:KProperty<*>): T {
        if (value == null) {
            value = block()
        }
        return value as T
    }
}

fun <T> later(block:() -> T) = Later(block)

相关文章

  • Kevin Learn Kotlin:委托

    Kotlin 通过关键字 by 实现委托。 类委托 类的委托即一个类中定义的方法实际是调用另一个类的对象的方法来实...

  • Kevin Learn Kotlin:函数

    Kotlin 的方法 变量 Kotlin 中定义一个变量,只允许在变量前声明两种关键字:val 和 var。 va...

  • Kevin Learn Kotlin:Kotlin 学习资料

    Кotlin 是一种在 Java 虚拟机上运行的现代编程语言。它具有优雅的语法,并且可以与所有现有的 Java 库...

  • Kevin Learn Kotlin:From Java to

    虽然 Kotlin 的开发很方便,但当你与他人协作时,总会碰到 Java 与 Kotlin 代码共存的代码项目。 ...

  • Kevin Learn Kotlin:协程

    什么是协程 协程就像非常轻量级的线程。线程是由系统调度的,线程切换或线程阻塞的开销都比较大。而协程依赖于线程,但是...

  • Kevin Learn Kotlin:Hello World

    思维导图 搭建开发环境 安装 Android StudioAndroid Studio 下载官网[https://...

  • Kevin Learn Kotlin:条件控制

    条件控制是每门编程语言中必不可少的,一般就是我们熟知的 if - else ,来作为我们代码逻辑选择条件控制。在 ...

  • Kevin Learn Kotlin:循环控制

    循环控制语句也是每门语言不可缺少的一部分,Java 中主要有两种循环语句:while 循环和 for 循环。Kot...

  • Kevin Learn Kotlin:泛型

    Kotlin 的泛型与 Java 一样,都是一种语法糖。泛型其实就是把类型参数化,它的引入给强类型编程语言加入了更...

  • Kevin Learn Kotlin:数据容器(集合)

    容器是用于存放数据的载体。容器分为数据、集合。 Kotlin 集合 各种集合对于解决问题都具有重要意义,并且经常用...

网友评论

    本文标题:Kevin Learn Kotlin:委托

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