使用派生字段创建一个新的 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
修饰符。
因此您可以省略要继承的字段,但不能省略要覆盖的字段。
在 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
修饰符。
因此您可以省略要继承的字段,但不能省略要覆盖的字段。