【发布时间】: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 初始化的范围内?
请原谅我的无知.. 这是一场真正的斗争。谢谢!
【问题讨论】: