Делегация Котлин - PullRequest
       7

Делегация Котлин

0 голосов
/ 12 марта 2019

Я не понимаю, как работает Kotlin Delegation, когда дело доходит до включения Bluetooth на Android.

Я сталкивался с этой справочной документацией на веб-сайте 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()
}

Условие by в списке супертипов для Derived указывает, что b будет храниться внутри объектов Derived икомпилятор сгенерирует все методы Base, которые перенаправляют на b.

В принципе, я понимаю, что класс BaseImpl наследует от Base, и поэтому, когда мы объявляем val b = BaseImpl(10) всеработает так, как если бы это была Java, но как только мы представили этот класс Derived, я запутался в том, что пытается достичь директива : Base by b.

Мы только ищем возможности реализовать нужные методы и переопределять все остальные?

Я думаю, что заблудился в тезисах всего этого.Поэтому, когда я пытаюсь включить Bluetooth, я не совсем уверен, что здесь происходит.

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

Я надеюсь, что я не задаю слишком много вопросов или даже слишком широкий вопрос, но когда мыобъявляя bluetoothAdapter когда он инициализируется?Это инициализируется прямо здесь или просто когда мы его используем?И инициализируется ли он тем, что находится между {} s?Таким образом, bluetoothManager находится только в пределах объема при инициализации bluetoothAdapter?

Пожалуйста, прости мое невежество ... Это настоящая борьба.Спасибо!

1 Ответ

2 голосов
/ 12 марта 2019

В фрагменте кода в основном происходит, когда переменная вызывается / используется, блок кода в 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...