Kotlin透明属性解析器?

时间:2018-02-08 19:07:48

标签: kotlin delegation

代码比单词更简单:

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

fun main(args: Array<String>) {
    val v = Dim3(Dim2(1,2) , 3)
    println("value : x = ${v.dim2.x} , y = ${v.dim2.y} , z = ${v.z} ")
}

因为Kotlin主张继承的构成,所以我将Dim2写成Dim3

但在Dim3中,访问Dim2的属性非常难看。不如继承那么优雅。

解决这个问题的一种方法是:

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<String>) {
    val v : IDim3 = Dim3(Dim2(1,2) , 3)
    println("value : x = ${v.x} , y = ${v.y} , z = ${v.z} ")
}

它有效,但它太过分了。需要将所有字段提取到界面。

有没有更好的解决方案?

1 个答案:

答案 0 :(得分:2)

添加这些属性的另一种方法是使用extensions

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

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