Kotlin透明属性解析器?

代码比单词简单:

data class Dim2(val x:Int , val y:Int) data class Dim3(val dim2:Dim2 , val z:Int) fun main(args: Array) { val v = Dim3(Dim2(1,2) , 3) println("value : x = ${v.dim2.x} , y = ${v.dim2.y} , z = ${vz} ") } 

因为Kotlin主张inheritance的构成,所以我把Dim2写成Dim3

但在Dim3 ,访问Dim2的属性非常难看。 不如inheritance优雅。

解决这个问题的一个办法是这样的:

 interface IDim2 { val x:Int val y:Int } interface IDim3 : IDim2 { val z:Int } data class Dim2(override val x:Int , override val y:Int) : IDim2 data class Dim3(val dim2:Dim2 , override val z:Int) : IDim3 , IDim2 by dim2 fun main(args: Array) { val v : IDim3 = Dim3(Dim2(1,2) , 3) println("value : x = ${vx} , y = ${vy} , z = ${vz} ") } 

它的工作,但它太过分了。 所有的领域需要提取到接口。

有没有更好的解决方案?

另一种添加这些属性的方法是使用扩展名 :

 data class Dim2(val x:Int , val y:Int) data class Dim3(val dim2:Dim2 , val z:Int) val Dim3.x: Int get() = dim2.x val Dim3.y: Int get() = dim2.y 

虽然这仍然需要一些样板代码,但它比inheritance解决方案更紧凑。