Как сохранить синтаксис свойства Kotlin при определении интерфейса? - PullRequest
0 голосов
/ 08 апреля 2020

УТОЧНЕНИЕ: синтаксис свойства == val s = supportFragmentManager в отличие от val s = getSupportFragmentManager()

Если я пишу интерфейс для класса Activity и хочу выставить свойство при сохранении синтаксиса свойства, как мне это сделать? сделать это?

Создать класс, наследующий AppCompatActivity и реализующий следующий интерфейс.

interface MyInterface {
   fun getSupportFragmentManager: FragmentManager // Option 1 Boo!
   val supportFragmentManager: FragmentManager    // Option 2 Yey!
}

Вариант 1 будет работать просто отлично. MyActivity уже содержит функцию getSupportFragmentManager (), поэтому мне не нужно ее реализовывать.

Вариант 2 предложит мне реализовать отсутствующее свойство, и в результате я получу следующее

class MyActivity: AppCompatActivity(), MyInterface {
    override val supportFragmentManager: FragmentManager
        get() = TODO("Not yet implemented")
}

Это даст мне ошибку, так как уже есть функция с таким же подпись в классе.

Accidental override: The following declarations have the same JVM signature (getSupportFragmentManager()Landroidx/fragment/app/FragmentManager;):
    fun <get-supportFragmentManager>(): FragmentManager defined in com.my.project.MyActivity
    fun getSupportFragmentManager(): FragmentManager defined in com.my.project.MyActivity

Какие-либо идентификаторы того, как сохранить синтаксис свойств Kotlins во всех интерфейсах?

1 Ответ

0 голосов
/ 08 апреля 2020

Я только что проверил предупреждения компилятора, и исключение случайного переопределения, которое вы получаете, связано с определением как функции get, так и самой исходной переменной.

Вы можете сделать это так:

interface MyInterface {
   val supportFragmentManager: FragmentManager
}

class MyActivity: AppCompatActivity(), MyInterface {
    override val supportFragmentManager: FragmentManager = FragmentManager(...)
        get() = ... //logic (getter is optional, by default kotlin generates getter itself)
}

PS: В геттере вы можете использовать field для доступа к переменной aka supportFragmentManager, например

get() = field.apply { updateSomthing() }

, это вызывает MyActivity.updateSomthing () и возвращает само поле.

...