如何解决使用派生字段创建一个新类而不复制字段名称
在 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
修饰符。
因此您可以省略要继承的字段,但不能省略要覆盖的字段。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。