如何在Kotlin中对方法/字段进行部分委托?

具体来说:这里我试图从接口TraitA继承类User,并在包装器StateA中实现字段marked: Boolean.这将清理User实现,因为marked只是一个状态字段.注意TraitA不能是一个类,因为我想使用几个这样的接口:User() : TraitA by StateA, TraitB by StateB, ..

/* does not compile (Kotlin M12) */
interface TraitA {
    var marked: Boolean

    fun doStaffWithMarked()  // must be overridable
}

class StateA() : TraitA {
    override var marked = false
}

class User() : TraitA by StateA(){
    override fum doStaffWithMarked() {
        //...all fancy logic here...
    }
}

The alternative is to implement all in one place:

class User() : TraitA{
    override var marked = false // ugly code

    override fum doStaffWithMarked() {
        //...
    }
}

Is there a way/pattern that would solve that problem with easy and as little code as possible? Code/bytecode generation is not an option for me.

UPDATE

我对此不是很清楚,但请注意,每User人中有doStaffWithMarked()人是unique人.

So I may suggest a 'half-bad' solution with run-time assertions:

interface TraitA {
    var marked: Boolean

    /* must be overridden */
    fun doStaffWithMarked() = throw UnsupportedOperationException()
}

class StateA() : TraitA {
    override var marked = false
}

class User() : TraitA by StateA() {
    override fum doStaffWithMarked() {
        //...all fancy logic here...
    }
}

The question is still open, since a really good solution would check that doStaffWithMarked() at compilation time.

推荐答案

Split up TraitA into two interfaces, then delegate the one and implement the other:

interface TraitA {
    var marked: Boolean
}

interface TraitAPlus : TraitA {
    fun isMarked(): Boolean
}

class StateA() : TraitA {
    override var marked = false
}

class User() : TraitA by StateA(), TraitAPlus {
    override fun isMarked(): Boolean {
        return marked
    }
}

Kotlin相关问答推荐

如何在 Big Data 中使用Inc过滤器?

在KMP中使用koin将来自Android的上下文注入到SQLDelight Driver中

Spring Boot Kotlin 数据类未使用 REST 控制器中的默认值初始化

Kotlin 函数中接收者和参数的类型相同

jlink:在合并模块和 kotlin.stdlib 中打包 kotlin.*

Eclipse:无法安装 Kotlin 插件

有没有一种简单的方法可以将数组/列表中的每个元素相互相乘 - Kotlin?

为什么没有remember 的 mutableStateOf 有时会起作用?

如何在 kotlin @Parcelize 中使用 null

将 Firebase 数据快照反序列化为 Kotlin 数据类

runOnUiThread 没有调用

如何在 Android Studio 3.1.3 中查看 Kotlin 中有趣的源代码?

如何在 Spring WebFlux 的响应正文中流式传输二进制数据

Kotlin如何分派invoke操作符?

Android:在 DAO 中使用 Room 数据库和 LiveData 架构

如何使用协调器布局和行为在CardView上完成此动画?

接口中的属性不能有支持字段

如何启用spring security kotlin DSL?

有没有办法在Kotlin中设置一个私有常量

在 Android 12 (SDK 31) 中获取 android.app.ForegroundServiceStartNotAllowedException