Как я могу использовать переменную в своем внутреннем классе? - PullRequest
0 голосов
/ 04 марта 2019

У меня есть этот код с использованием Kotlin:

class A{
    var myVariable:String?=null

    constructor(myVariable:String){
        this.myVariable = myVariable
    }

    init {
        println("Success !")
    }

    inner class B{
        init {
            println(myVariable)
        }
    }
}

fun main(args:Array<String>){
    var b = A("test").B // this does not work
}

И, к сожалению, он не работает, я получаю:

Error:(20, 23) Kotlin: Nested class 'B' accessed via instance reference
Error:(20, 23) Kotlin: Classifier 'B' does not have a companion object, and thus must be initialized here

Как мне решить мою проблему?

Ответы [ 3 ]

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

Попробуйте это:

class A{
    var myVariable:String?=null

    constructor(myVariable:String){
        this.myVariable = myVariable
    }

    init {
        println("Success !")
    }

    inner class B{
        init {
            println(myVariable)
        }
    }
}

fun main(args:Array<String>){
    var b = A("test").B() // You have to call the constructor here
}
0 голосов
/ 04 марта 2019

Когда вы делаете:

A("test").B

Вы говорите: «Извлечь что-то из экземпляра A» - в данном случае это класс.Тем не менее, это не тот синтаксис, который вы ищете в вашем случае.Вы можете получить в основном все что угодно, но получение справки - это отдельная проблема.Если вы хотите получить функцию, синтаксис отличается от получения поля или вызова функции.Хотя это не очень важно, но все же стоит помнить об этом.

Поскольку B является внутренним классом, вы до сих пор совершенно правы, что сначала вам нужен экземпляр A.Но вам также нужен экземпляр B. Когда вы инициализируете B, он все еще «связан» с родительским классом, поэтому вы можете обращаться к внешним переменным без каких-либо проблем.Тем не менее, это все еще инициализируемый класс - и вам нужно его инициализировать.

Так что вам также нужно инициализировать B.Синтаксис Kotlin для этого довольно хорош (где синтаксис в Java немного ужасен ) - все, что вам нужно добавить, это () в конце.

Итак, вы получите следующее:

val b = A("test").B()
// ...

Это потому, что это внутренний класс.Если бы у вас был статический внутренний класс (в Kotlin, это класс внутри класса без ключевого слова inner), инициализация была бы A.B() - A не инициализировалась в этих случаях.

Вы также можете разделить инициализацию:

val a = A("test")
val b = a.B(); 

Когда у вас есть переменная, она точно такая же, как и любая другая переменная - единственное отличие здесь - инициализация.

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

Вы должны создать экземпляр (конструктор вызова) класса B перед доступом к его членам:

fun main(args:Array<String>) {
    val b = A("test").B()
    b.someFunction() 
}


class A {
    var myVariable:String? = null

    constructor(myVariable: String) {
        this.myVariable = myVariable
    }

    init {
        println("Success !")
    } 

    inner class B {
        init {
            println(myVariable)
        }

        fun someFunction() {
            myVariable = "set new value to the variable"
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...