Kotlin 是否可以在不重写参数的情况下扩展数据类中的基类?

Kotlin 是否可以在不重写参数的情况下扩展数据类中的基类?,kotlin,Kotlin,我在Kotlin项目中有一个简单的继承树,其中基类由数据类扩展。如果不重写基类中的参数,则无法声明数据类的构造 我注意到,如果我不在数据类中进行扩展,这将起作用: open class Base( val first: String, val second: String ) class Child( first: String, second: String, val third: List<String> ) : Base(first,

我在Kotlin项目中有一个简单的继承树,其中基类由数据类扩展。如果不重写基类中的参数,则无法声明数据类的构造

我注意到,如果我不在数据类中进行扩展,这将起作用:

open class Base(
    val first: String,
    val second: String
)

class Child(
    first: String,
    second: String,
    val third: List<String>
) : Base(first, second)
这就是我目前的结局:

open class Base(
    open val first: String,
    open val second: String
)

data class Child(
    override val first: String,
    override val second: String,
    val third: List<String>
) : Base(first, second)

但是我希望能够不重写构造函数参数,因为我并没有真正重写它们。我只需要将它们放入我的子构造函数中,就可以将它们传递给Base。

有这样一个基类和一个派生数据类,您必须重写它的属性或将它们分开,因为数据类的所有主构造函数参数也必须声明为属性:

open class Base(
    open val first: String,
    open val second: String
)

data class Child(
    val childFirst: String,
    val childSecond: String,
    val third: List<String>
) : Base(childFirst, childSecond)
abstract class Base {
    abstract val first: String,
    abstract val second: String
}

data class Child(
    override val first: String,
    override val second: String,
    val third: List<String>
) : Base()
-所有主构造函数参数都需要标记为val或var

但是,根据您的实际目标,您可以通过以下方式之一转换代码:

将子对象中的属性声明为独立的、不相关的属性:

open class Base(
    open val first: String,
    open val second: String
)

data class Child(
    val childFirst: String,
    val childSecond: String,
    val third: List<String>
) : Base(childFirst, childSecond)
abstract class Base {
    abstract val first: String,
    abstract val second: String
}

data class Child(
    override val first: String,
    override val second: String,
    val third: List<String>
) : Base()
这确保了Base的实现不会在子级属性的基础上存储属性值,这些属性会消耗额外的内存,但是,当属性被重写时,Base会始终将子级基础字段的值视为第一个和第二个

使基类成为具有抽象属性的抽象类:

open class Base(
    open val first: String,
    open val second: String
)

data class Child(
    val childFirst: String,
    val childSecond: String,
    val third: List<String>
) : Base(childFirst, childSecond)
abstract class Base {
    abstract val first: String,
    abstract val second: String
}

data class Child(
    override val first: String,
    override val second: String,
    val third: List<String>
) : Base()
这遵循一个类似的目的:Base不会在其实现中存储属性值,不必要地复制Child的属性

使Child成为一个普通类,手动实现您实际需要的类


谢谢@hotkey!我喜欢有界面的建议!