Kotlin的部分class级代表团
如何在Kotlin中部分委托方法/字段?
具体来说:我在这里试图从接口TraitA
inheritance类User
,并在包装器StateA
实现marked: Boolean
的StateA
。 这将清理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() { //... } }
有没有一种方法/模式能够尽可能简单且尽可能少的代码来解决这个问题? 代码/字节码的生成不是我的选择。
UPDATE
我不是很清楚,但请注意, 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 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 } }
这是一个从StateA
inheritance的版本,而不是委托,但这不是很好:
interface TraitA { var marked: Boolean fun isMarked(): Boolean } abstract class StateA() : TraitA { override var marked = false } class User() : TraitA, StateA() { override fun isMarked(): Boolean { return marked } }
在这里,我将TraitA
委托给一个匿名的StateA
实例, StateA
方法有点不太StateA
class User() : TraitA by object : StateA() { override fun isMarked(): Boolean { return marked } } { }
说实话,我宁愿重新考虑类层次结构的设计。 特别是,你可以把方法实现放在接口中(但不是属性值),所以如果isMarked()
只依赖于marked
你可以直接把它的实现放在TraitA
。 您的代码然后变成:
interface TraitA { var marked: Boolean fun isMarked(): Boolean { return marked } } class StateA() : TraitA { override var marked = false } class User() : TraitA by StateA() { }
编辑:单独的答案: https : //stackoverflow.com/a/30914383/615306