我正在努力解决数据类和多态问题。我想从不变性中受益,但仍然能够更新我的状态。为此,我希望能够使用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<Aging>) =
// Not possibe, no copy function on Aging
products.map { it.copy(age = it.age + 1) }
}
如何以多态方式创建更新的副本?
我已尝试为界面提供copy
功能,但如果子类型具有其他属性,则他们不会覆盖复制功能。
令我感到沮丧,因为我知道子类型具有该属性,但我不能在界面中利用这些知识。
答案 0 :(得分:6)
[OP:]我提出的最好的方法是在界面中声明复制功能:
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)
}
函数不会覆盖接口中的那个。
带有年龄复制实现的子类型如下:
{{1}}
希望获得更好的解决方案(或Kotlin改进;))。
修改已更新,以遵循Ghedeons的建议。