Kotlin 是否可以在不重写参数的情况下扩展数据类中的基类?
我在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,
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!我喜欢有界面的建议!