【问题标题】:Kotlin DelegationKotlin 代表团
【发布时间】:2019-03-13 02:14:34
【问题描述】:

当谈到在 android 上启用蓝牙时,我无法理解 Kotlin 委托的工作原理。

我在 Kotlin 网站上看到了这个参考文档,但我似乎有些不知所措。

https://kotlinlang.org/docs/reference/delegation.html

interface Base {
    fun print()
}

class BaseImpl(val x: Int) : Base {
    override fun print() { print(x) }
}

class Derived(b: Base) : Base by b

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

Derived 的超类型列表中的by 子句表示b 将在内部存储在Derived 的对象中,并且编译器将生成Base 的所有方法转发到b .

基本上,我知道BaseImpl 类继承自Base,所以当我们声明val b = BaseImpl(10) 时,一切都像Java 一样工作,但是一旦我们引入这个Derived 类,我就对@987654333 的指令感到困惑@正在努力实现。

我们是否只想实现我们想要的方法并覆盖所有其他方法?

我想我迷失在这一切的摘要中。因此,当我希望启用蓝牙时,我不确定这里发生了什么。

private val bluetoothAdapter: BluetoothAdapter? by 
                                 lazy(LazyThreadSafetyMode.NONE) {
    val bluetoothManager = 
        getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
    bluetoothManager.adapter
}

我希望我没有问太多问题,甚至没有提出太宽泛的问题,但是当我们声明 bluetoothAdapter 时,它什么时候会被初始化?它是在此处初始化还是仅在我们使用时初始化?它是否使用{}s 之间的内容进行初始化?因此bluetoothManager 仅在bluetoothAdapters 初始化的范围内?

请原谅我的无知.. 这是一场真正的斗争。谢谢!

【问题讨论】:

    标签: android kotlin bluetooth


    【解决方案1】:

    在代码 sn-p 中,基本上发生的情况是当变量被调用/使用时,lazy{} 中的代码块被执行,最后代码中的任何结果都被存储在变量中。

    所以当 bluetoothAdapter 像 bluetoothAdapter.something() 一样使用时, 第一次调用 bluetoothAdapter 时,将执行惰性块并执行结果

     val bluetoothManager = getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
     ---> bluetoothManager.adapter
    

    将存储在 bluetoothAdapter 变量中,并且该块在第一次调用时只会执行一次。

    简单来说就像打电话

    fun initializeAdapter():BluetoothManager? {
           val bluetoothManager = getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
           return bluetoothManager.adapter
    }
    

    在使用 bluetoothAdapter 变量之前。

    【讨论】:

    • 啊.. 我认为这是有道理的。我就像 Kotlin 的超级新手,正在努力学习。将调用带有惰性{}的代码或放置代码的过程是什么?该委托或与委托模式有关,还是只是一种不同的初始化方式?这在 Kotlin 中似乎有些普遍。再次感谢!
    • 很高兴为您提供帮助 :) Kotlin 是一门了不起的语言,使用它你会获得很多乐趣!
    猜你喜欢
    • 2019-12-25
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 2020-06-25
    相关资源
    最近更新 更多