使用派生字段创建一个新的 class,不重复字段名称

Create a new class with derived fields without duplicating field names

在 Kotlin 中,如何从基本定义(抽象、接口、继承等)派生字段而不显式覆盖它们?

我能得到的最接近的是:

abstract class Person {
    open val name: String = "Stranger"
}

data class Doctor(
    override val name: String,
    val yearsOfExperience: Int
): Person()

val doc = Doctor(yearsOfExperience = 20, name = "Eric")

但理想情况下,由于我有一个包含数百个字段的不可更改模型的用例,我希望:

abstract class Person {
    open val name: String = "Stranger"
}

data class Doctor(
    val yearsOfExperience: Int
): Person()

val doc = Doctor(yearsOfExperience = 20, name = "Eric")

你不能。如果您希望 Doctor 能够将 Person.name 更改为 Person 中定义的内容以外的任何内容,那么根据定义,您将覆盖 Person 中的行为 - Kotlin 只是在强迫您使合同明确。

如果它不这样做,则可以这样做:

data class Doctor(
    val yearsOfExperience: Int
) : Person()

然后决定添加一个 name 字段:

data class Doctor(
    val yearsOfExperience: Int,
    val name: String = "Doctor"
) : Person

现在 Doctor.name 具有默认值 "Doctor",这与 Person 中定义的预期行为不同。以前执行 Doctor(yearsOfExperience = 20) 的代码现在会有所不同 - 它会得到 name "Doctor" 而不是 "Stranger"。Kotlin 确保你意识到这一点,并明确要求它通过添加 override 修饰符。

因此您可以省略要继承的字段,但不能省略要覆盖的字段。