Kotlin的部分class级代表团

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

具体来说:我在这里试图从接口TraitAinheritance类User ,并在包装​​器StateA实现marked: BooleanStateA 。 这将清理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 } } 

这是一个从StateAinheritance的版本,而不是委托,但这不是很好:

 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

Interesting Posts