代码比单词更简单:
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} ")
}
它有效,但是过于矫kill过正。需要提取所有字段以进行接口(interface)。
有没有更好的解决方案?
最佳答案
添加这些属性的另一种方法是使用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
尽管这仍然需要一些样板代码,但它比继承解决方案更紧凑。