如何在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.