【发布时间】:2015-09-03 07:53:46
【问题描述】:
如何在 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...
}
}
另一种方法是在一个地方实现所有功能:
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 中的 isMarked() 似乎是多余的。您可以按原样访问标记。
-
isMarked()做了很多花哨的员工,并且必须为每个最终用户覆盖 -
我认为这不会很快实现,因为 StateA 并不是一个真正的完整类,如果不提供 doStaffWithMarked() 的实现,就无法实例化它,因此 StateA 本身是无用的。而且有一些像 User 是一个完整的类和 StateA 这是一个不完整的类这样的类非常奇怪,我猜对类型检查会很痛苦
标签: multiple-inheritance delegation kotlin