Подскажите базовый принцип интефейса в Kotlin на моём примере
В примере базовый каркас приложения по работе с GPS.
Вопрос по инициализации переменной locListenerInterface в классе GpsClass. Как понять концептуально, что мы присваиваем этой переменной при определении?
private var locListenerInterface: LocListenerInterface = (myContext as LocListenerInterface)
Работает так же
private var locListenerInterface: LocListenerInterface = (myContext as MainActivity)
Как вообще правильно инициализировать эту переменную, для передачи координат в MainActivity с класса GpsClass через интерфейс LocListenerInterface
class MainActivity : AppCompatActivity(), LocListenerInterface {
private val gps = GpsClass(this)
override fun onLocationChangedInterface(location: Location) {
// show updated location
}
}
interface LocListenerInterface {
fun onLocationChangedInterface (location: Location)
}
class GpsClass (private val myContext: Context) {
private var locListenerInterface: LocListenerInterface = (myContext as LocListenerInterface)
fun onLocationChanged(location: Location) {
locListenerInterface.onLocationChangedInterface(location)
}
}
Ответы (1 шт):
locListenerInterface у Вас типа LocListenerInterface. Поэтому присвоить ему нужно объект соответствующего типа. Вернее в данном случае объект реализующий интерфейс LocListenerInterface.
myContext у Вас типа Context. Скорее всего Context не наследует/реализует LocListenerInterface. Поэтому просто присвоить myContext в locListenerInterface Вы не можете. Компилятор выдаст ошибку.
Но Вы, как разработчик, знаете что реально внутри в myContext у Вас будет объект, который реализует/наследует и Context и LocListenerInterface. Поэтому Вы явно пишете компилятору считать myContext реализующим LocListenerInterface через ключевое слово as. Компилятор это компилирует, но также внутри добавляет код который проверяет в рантайме правда ли то, что пришло в myContext, реализует LocListenerInterface и если нет будет ошибка выполнения
И писать нужно именно так как в первом примере кода
Второй пример с MainActivity работает потому, что, по сути, внутри происходит как бы два преобразования - вначале вы явно приводите myContext к типу MainActivity, но компилятор видит что MainActivity реализует LocListenerInterface и неявно приводит еще раз MainActivity уже к LocListenerInterface и все опять компилируется.