gpt4 book ai didi

multiple-inheritance - Kotlin 中的部分类委托(delegate)

转载 作者:IT老高 更新时间:2023-10-28 13:37:45 27 4
gpt4 key购买 nike

如何在 Kotlin 中部分委托(delegate)方法/字段?

具体来说:这里我试图从接口(interface) TraitA 继承类 User 并在包装器 中实现字段 marked: Boolean >状态A。这将清理 User 实现,因为 marked 只是一个状态字段。请注意, TraitA 不能是一个类,因为我想使用几个这样的接口(interface): 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...
}
}

另一种方法是在一个地方实现所有功能:

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

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

有没有一种方法/模式可以用尽可能简单的代码解决这个问题?代码/字节码生成不是我的选择。

更新

对此我不是很清楚,但请注意 doStaffWithMarked() 对于每个 User 来说都是唯一>.

所以我可能会建议一个带有运行时断言的“半坏”解决方案:

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...
}
}

这个问题仍然悬而未决,因为一个非常好的解决方案会在编译时检查 doStaffWithMarked()

最佳答案

TraitA 拆分为两个接口(interface),然后委托(delegate)一个并实现另一个:

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
}
}

关于multiple-inheritance - Kotlin 中的部分类委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30902435/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com