(Kotlin) Передать аргумент из конструктора класса данных в супер конструктор? - PullRequest
0 голосов
/ 13 октября 2018

У меня есть абстрактный класс:
abstract class SuperClass(private val privateVal: Int)

У меня есть data class, расширяющий абстрактный класс.(DataClass)

Как я могу взять privateVal в качестве аргумента в конструкторе DataClass и передать его конструктору SuperClass?

Следующее не будет работать,потому что в конструкторе класса данных допускаются только val s и var s:
data class DataClass(privateVal: Int) : SuperClass(privateVar)

1 Ответ

0 голосов
/ 13 октября 2018

Классы данных работают иначе, чем обычные классы.Как вы уже заметили, классы данных требуют свойств в конструкторах.Классы данных и наследование сложно, потому что вы не можете передать значения, как в обычных классах.И наследование от класса данных также невозможно;они не поддерживают open или abstract, что означает, что оно окончательно и не может быть унаследовано от.

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

class Something(something: Int, else: Int) : Parent (something, else)

Однако, Kotlin поддерживает абстрактные var s и val s.Если вам абсолютно необходим класс данных в детстве (хотя я не рекомендую этого; использование обычного класса может быть лучше в зависимости от вашего варианта использования).

abstract class SuperClass {
    protected abstract val privateVal: Int
}
data class Overridden(override val privateVal: Int) : SuperClass()

Здесь он переопределяет val в конструкторе, то есть он все равно будет работать.Причина в том, что он protected, а не private, в том, что он не сможет наследовать, если он private.

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

...