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

Почему невозможно передать объект-член в конструктор суперклассов?

Это работает:


class Foo(private val whatever : Object = Object()) : BaseClass(whatever) {

    fun someFunction() {
        // Do something with "whatever"
        println(whatever.toString())
    }

}

Но это не так:


class Foo() : BaseClass(whatever) {

    private val whatever = Object()

    fun someFunction() {
        // Do something with "whatever"
        println(whatever.toString())
    }

}

Член whatever не может быть передан в базовый класс во втором примере. Это имеет смысл, поскольку подкласс инициализируется после базового класса и в настоящее время whatever еще не существует. Но почему работает первый пример?

Ответы [ 2 ]

0 голосов
/ 24 июня 2019

Проблема в Порядке инициализации .

Первый пример работает, потому что аргумент конструктора BaseClass является аргументом конструктора Foo.Нет проблем.Аргумент только что передан.

Второй пример не работает, потому что конструктор BaseClass необходимо вызвать в качестве первого шага до инициализации свойства whatever Foo.

РЕДАКТИРОВАТЬ:

Если вам действительно нужно инициализировать whatever внутри Foo, то вы можете использовать Companion Object .

class Foo2() : BaseClass(whatever) {

    companion object {
        private val whatever = Object()
    }

}
0 голосов
/ 24 июня 2019

при создании подкласса другого класса вы вызываете конструктор этого класса, например BaseClass(whatever).в этом случае объект whatever необходимо создать / передать в качестве параметров в первичном конструкторе этого подкласса.

В kotlin помимо создания свойств внутри класса, вы также можете определить его как параметрыв первичном конструкторе, используя var / val.как class Foo(val whatever : Object)

, но только на первичном конструкторе.

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