Kotlin 中的类常见行为 + 不变性

问题描述 投票:0回答:0

有没有办法以更不变的方式实现以下目标?

abstract class Abstract {
    abstract val general1: String
    abstract var counter: Int // Don't want to use var here

    fun sumCounter(value: Int) {
        counter += value
    }
}

data class A (
    val a1: String,

    override val general1: String,
    override var counter: Int = 0,
): Abstract()

data class B (
    val b1: String,
    val b2: String,

    override val general1: String,
    override var counter: Int = 1,
): Abstract()

fun <T : Abstract> doSomething(obj: T) {
    //...
    obj.sumCounter(10) // I want: val newObj = obj.sumCounter(10)


    println(obj) // A(a1=a1, general1=general1, counter=10)
                 // B(b1=b1, b2=b2, general1=general1, counter=11)
    //...
}

fun myMain() {
    val a = A("a1", "general1")
    doSomething(a)

    val b = B("b1", "b2", "general1")
    doSomething(b)
}

这可能是一些 Kotlin 技巧、功能方法或设计模式,以避免在

A
B
中创建相同的方法。但我不想使用反射或转换为 json 并返回。

kotlin generics design-patterns immutability data-class
© www.soinside.com 2019 - 2024. All rights reserved.