(Котлин) Передать аргумент из конструктора класса данных в суперконструктор?

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

У меня есть data class расширение абстрактного класса. (DataClass)

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

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


person user2851108    schedule 13.10.2018    source источник


Ответы (1)


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

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

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

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

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

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

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

person Zoe    schedule 13.10.2018
comment
Ах, я не думал о protected, я действительно не так часто делаю суперклассы. Спасибо! - person user2851108; 13.10.2018
comment
Мне нужно использовать классы данных для их copy() функций. - person user2851108; 13.10.2018