• Kotlin 进阶 学习 委托


    1.接口委托

    1. package com.jmj.jetpackcomposecompositionlocal.byStudy
    2. /**
    3. * 接口委托
    4. */
    5. interface HomeDao{
    6. fun getAllData():List
    7. }
    8. interface ADao{
    9. fun getById(id:Int):String
    10. }
    11. class HomeDaoImpl:HomeDao{
    12. override fun getAllData(): List {
    13. return listOf("home")
    14. }
    15. }
    16. class ADaoImpl:ADao{
    17. override fun getById(id: Int): String {
    18. return "object id = $id"
    19. }
    20. }
    21. //这里多态也可以
    22. class HomeService(homeDaoImpl: HomeDaoImpl,aDao: ADao):HomeDao by homeDaoImpl,ADao by aDao{
    23. fun getRedisData():String{
    24. return "redis"
    25. }
    26. }
    27. fun main() {
    28. val homeService = HomeService(HomeDaoImpl(),ADaoImpl())
    29. val allData = homeService.getAllData()
    30. println(allData)
    31. println(homeService.getById(3))
    32. }

    2.属性委托

    1. package com.jmj.jetpackcomposecompositionlocal.byStudy
    2. import kotlin.properties.ReadOnlyProperty
    3. import kotlin.properties.ReadWriteProperty
    4. import kotlin.reflect.KProperty
    5. fun main() {
    6. var test:String by MyTestClass()
    7. test="123"
    8. println(test)
    9. }
    10. //如果是只读变量 委托 就实现 ReadOnlyProperty 接口
    11. //<第一个类型是我们属性所属的那个类,第二个类型是我们属性本身的类型>
    12. class MyTestClass:ReadWriteProperty<Nothing?,String>{
    13. private var myVar = ""
    14. override fun getValue(thisRef: Nothing?, property: KProperty<*>): String {
    15. println("调用了get方法")
    16. return myVar
    17. }
    18. override fun setValue(thisRef: Nothing?, property: KProperty<*>, value: String) {
    19. println("调用了set方法")
    20. myVar = value
    21. }
    22. }
    1. package com.jmj.jetpackcomposecompositionlocal.byStudy
    2. import kotlin.properties.ReadOnlyProperty
    3. import kotlin.properties.ReadWriteProperty
    4. import kotlin.reflect.KProperty
    5. fun main() {
    6. A().apply {
    7. this.aTest = "hello"
    8. println(aTest)
    9. }
    10. }
    11. class A{
    12. var aTest:String by MyTestClass()
    13. }
    14. class B{
    15. var aTest:String by MyTestClass()
    16. }
    17. //如果是只读变量 委托 就实现 ReadOnlyProperty 接口
    18. //<第一个类型是我们属性所属的那个类,第二个类型是我们属性本身的类型>
    19. class MyTestClass:ReadWriteProperty<Any,String>{
    20. private var myVar = ""
    21. override fun getValue(thisRef: Any, property: KProperty<*>): String {
    22. return myVar
    23. }
    24. override fun setValue(thisRef: Any, property: KProperty<*>, value: String) {
    25. myVar =value
    26. }
    27. }

    3.延迟委托

    1. package com.jmj.jetpackcomposecompositionlocal.byStudy
    2. fun main() {
    3. val test by lazy{
    4. println("初始化了test")
    5. "hello"
    6. }
    7. println(test)
    8. }

    4.监听委托

    1. package com.jmj.jetpackcomposecompositionlocal.byStudy
    2. import kotlin.properties.Delegates
    3. fun main() {
    4. var test by Delegates.observable("hello"){_, oldValue, newValue ->
    5. println("oldValue $oldValue")
    6. println("newValue $newValue")
    7. }
    8. test = "TEAt"
    9. test = "TEAt"
    10. test = "TEAt"
    11. println(test)
    12. println(test)
    13. println(test)
    14. println(test)
    15. println(test)
    16. }

     实际上还是实现了ReadWriteProperty这个接口来实现监听委托

    Jetpack compose 里的状态 也是 委托实现 重构 compose。

    就是 Mutable 返回一个 状态对象 这个对象里的属性 被另一个类委托了,这个属性调用了 set方法

    就会委托去调用委托类的set方法,然后在那个实现方法里去实现compose组件重构,完成页面渲染

     
  • 相关阅读:
    JavaScript 编写一个 数值转换函数 万以后简化 例如1000000 展示为 100万 万以下原来数值返回
    常规性能调优RDD优化_大数据培训
    计算机网络(第二弹) --- 网络传输的基本流程最容易理解的讲述
    微服务架构之(SpringCloud、Docker、Dubbo与SpringBoot)啃完技术突飞猛进!
    【LeetCode每日一题:1774. 最接近目标价格的甜点成本~~~递归+深度优先遍历】
    1314. 矩阵区域和-矩阵前缀和算法
    hyperf redis-cluster连接
    Linux shell 从文本文件读取文件列表循环拷贝
    《硅基物语.AI写作高手:从零开始用ChatGPT学会写作》&《从零开始读懂相对论》
    基于SpringBoot+thymeleaf的物资管理系统
  • 原文地址:https://blog.csdn.net/qq_53374893/article/details/136240706