(Kotlin) 将参数从数据类构造函数传递到超级构造函数?

use*_*108 0 inheritance constructor superclass kotlin data-class

我有一个抽象类:
abstract class SuperClass(private val privateVal: Int)

我有一个data class扩展抽象类。( DataClass)

如何privateValDataClass构造函数中将其作为参数并将其传递给SuperClass构造函数?

以下将不起作用,因为数据类构造函数中只允许使用vals 和vars:
data class DataClass(privateVal: Int) : SuperClass(privateVar)

Zoe*_*Zoe 5

数据类的工作方式与常规类不同。正如您已经注意到的,数据类需要构造函数中的属性。数据类和继承很难,因为您不能像在常规类中那样传递值。从数据类继承也是不可能的;他们不支持openor abstract,这意味着它是最终的,不能继承。

实际上,如果您有一个数据类作为孩子,这是不可能的:

class Something(something: Int, else: Int) : Parent (something, else)
Run Code Online (Sandbox Code Playgroud)

但是,Kotlin 确实支持 abstract vars 和vals。如果您绝对需要一个数据类作为孩子(尽管我不建议这样做;根据您的用例,使用常规类可能会更好)。

abstract class SuperClass {
    protected abstract val privateVal: Int
}
data class Overridden(override val privateVal: Int) : SuperClass()
Run Code Online (Sandbox Code Playgroud)

在这里它覆盖了构造函数中的 val,这意味着它仍然可以工作。它是protected和不是的原因private是因为如果它是private.

不过,我真的建议在这里使用常规类而不是数据类。