Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 统一数据类属性访问的最佳实践是什么_Oop_Kotlin_Generics_Inheritance - Fatal编程技术网

Oop 统一数据类属性访问的最佳实践是什么

Oop 统一数据类属性访问的最佳实践是什么,oop,kotlin,generics,inheritance,Oop,Kotlin,Generics,Inheritance,我有一门课要上 data class ExpenseDto( val id: Int, val name: String, val aggregationA: ExpenseAggregationA, val aggregationB: ExpenseAggregationB, val aggregationC: ExpenseAggregationC, ) 它的所有关联都有相同的字段。在这里可以应用哪些最佳实践来实现这一目标 data class Ex

我有一门课要上

data class ExpenseDto(
    val id: Int,
    val name: String,
    val aggregationA: ExpenseAggregationA,
    val aggregationB: ExpenseAggregationB,
    val aggregationC: ExpenseAggregationC,
)
它的所有关联都有相同的字段。在这里可以应用哪些最佳实践来实现这一目标

data class ExpenseAggregationA(
    val id: Int,
    val text: String? = null
)

data class ExpenseAggregationB(
    val id: Int,
    val text: String? = null
)

data class ExpenseAggregationC(
    val id: Int,
    val text: String? = null
)

数据类
es可以从
密封类
继承

sealed class ExpenseAggParent (val id: Int, val text: String? = null) {
    data class ExpAggA( override val id: Int, override ...)
    data class ...
    data class ...
}
除此之外,有时我喜欢使用“property unifier”接口,尤其是在重构遗留代码时,使用具有相同语义但属性名称不同的类:

interface HasId(val id: Int)

data class ExpenseAggregationX(
   override val id: Int,
   ...
): HasId

data class ExpenseAggregationY: HasId {

   val someOtherNameButStillId: Int

   override val id: Int
       get() = this.someOtherNameButStillId
}
当然,您可以使用良好的旧界面,但为此,您可以重复使用上述方法:

interface ExpenseAggregation: HasId, HasText

data class ExpenseAggregationA(
    override val id: Int,
    ...
): ExpenseAggregation

// Other approach for classes with other existing names, see above
data class ExpenseAggregationB: ExpenseAggregation {
    ...
}

这接近于Kotlin目前不直接支持的混合方法,但为了完整性,如果您的类是服务而不是DTO,则可以使用该方法。

您不能只使用1个数据类
ExpenseAgregation
?或者您希望这些类型是分开的吗?我需要这些类型是分开的,因为它们与不同的模式有关系