作者:小呀小-儿郎 | 来源:互联网 | 2023-01-23 23:49
我正在努力处理数据类和多态.我想从不变性中受益,但仍然能够更新我的状态.为此,我希望能够使用该copy
功能.
我们举个例子吧.我有这个类层次结构:
interface Aging {
val age : Int
}
data class Cheese (
override val age : Int
// more Cheese specific properties
) : Aging
data class Wine (
override val age : Int,
val grape : String
// more Wine specific properties
) : Aging
现在我希望能够做这样的事情(但是这不工作):
class RipeningProcess(){
fun ripen(products : List) =
// Not possibe, no copy function on Aging
products.map { it.copy(age = it.age + 1) }
}
如何以多态方式创建更新的副本?
我试图给接口一个copy
函数,但如果子类型有其他属性,它们不会覆盖复制函数.
这令人沮丧,因为我知道子类型具有该属性,但我不能在界面中利用这些知识.
1> Stim..:
[OP:]我提出的最好的方法是在界面中声明复制功能:
interface Aging {
val age : Int
fun copy(age : Int) : Aging
}
这开箱即用于没有其他属性的数据类子类型(即问题中的Cheese).对于具有其他属性的数据类子类型,您需要显式声明它,因为生成的copy
函数不会覆盖接口中的函数.
具有它的年龄复制实现的子类型如下所示:
data class Wine(
override val age : Int,
val grape : String
) : Aging {
// Different parameter name, to avoid conflict with generated copy method
override fun copy(_age: Int) = copy(age = _age)
}
希望有更好的解决方案(或Kotlin改进;)).
编辑:更新以遵循Ghedeons的建议.