如何更新实现通用接口的数据类

时间:2017-08-09 07:30:19

标签: kotlin data-class

我正在努力解决数据类和多态问题。我想从不变性中受益,但仍然能够更新我的状态。为此,我希望能够使用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功能,但如果子类型具有其他属性,则他们不会覆盖复制功能。
令我感到沮丧,因为我知道子类型具有该属性,但我不能在界面中利用这些知识。

1 个答案:

答案 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的建议。