Свойства конструктора Kotlin val не могут использоваться в классе - PullRequest
0 голосов
/ 02 ноября 2018

следующих работ

class PagerAdapter(var tabCount: Int, fm: FragmentManager?) : FragmentStatePagerAdapter(fm) {
    override fun getItem(p0: Int): Fragment { 
        return when (p0) {
            0 -> TabFragment1()
            1 -> TabFragment2()
            2 -> TabFragment3()
            else -> throw IllegalArgumentException("Invalid color param value")
        }
    }
    override fun getCount() = tabCount
}  

и это не так (неразрешенная ссылка: tabCount)

class PagerAdapter(tabCount: Int, fm: FragmentManager?) : FragmentStatePagerAdapter(fm) {
    override fun getItem(p0: Int): Fragment { 
        return when (p0) {
            0 -> TabFragment1()
            1 -> TabFragment2()
            2 -> TabFragment3()
            else -> throw IllegalArgumentException("Invalid color param value")
        }
    }
    override fun getCount() = tabCount
}  

Я новичок в Kotlin и просто растерялся, почему вы не можете использовать свойства val в самом классе. Может кто-нибудь объяснить, пожалуйста? Спасибо

Ответы [ 3 ]

0 голосов
/ 02 ноября 2018

Второй не работает, так как вы не объявляете какие-либо свойства для класса. Простое упоминание их в скобках не делает их свойствами, скорее их можно сравнить, как если бы они были просто параметрами конструктора.

Вы можете использовать var или val ... вы можете сделать их private, если хотите.

Проверьте также Ссылка Kotlins о классах и наследовании, в частности, глава конструктора :

Фактически, для объявления свойств и их инициализации из основного конструктора, Kotlin имеет краткий синтаксис:

class Person(val firstName: String, val lastName: String, var age: Int) { ... }

Подобно обычным свойствам, свойства, объявленные в основном конструкторе, могут быть изменяемыми var или только для чтения val.

0 голосов
/ 02 ноября 2018

Это работает

class PagerAdapter(var tabCount: Int) : SomeBase() {
    override fun getCount() = tabCount
}  

, поскольку при указании var или val в качестве основного параметра конструктора параметр становится свойством класса.


Но когда вы не указываете параметр с помощью var или val, он не сохраняется. Тем не менее, вы все равно можете использовать это значение внутри init блока:
class PagerAdapter(tabCount: Int) {
    init {
        Log.d("$tabCount")
    }
}  

или для инициализации некоторого пользовательского свойства:

class PagerAdapter(tabCount: Int) {
    val tabCountTenTimes: Int = tabCount * 10
}

Хотя вы не можете использовать такой параметр в методе, как вы пытались - для этого вам нужно свойство.

0 голосов
/ 02 ноября 2018

tabCount и fm в class PagerAdapter(tabCount: Int, fm: FragmentManager?) являются просто параметрами конструктора. Они не являются членами класса.

Это как

class PagerAdapter extends FragmentStatePagerAdapter {
    PagerAdapter(int tabCount, FragmentManager fm) {
        super(fm)
    }
    ...
}

на Java.

Вы должны указать, что они являются полями класса, добавив перед ними val.

class PagerAdapter(val tabCount: Int, val fm: FragmentManager?) : FragmentStatePagerAdapter(fm) {
    override fun getItem(p0: Int): Fragment { 
        return when (p0) {
            0 -> TabFragment1()
            1 -> TabFragment2()
            2 -> TabFragment3()
            else -> throw IllegalArgumentException("Invalid color param value")
        }
    }
    override fun getCount() = tabCount
}  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...