【发布时间】:2021-12-03 15:57:54
【问题描述】:
目前我有三个枚举类代表状态机中的状态和一个显示操作
interface State
enum class OperationState : State {
InProgress,
Finished,
Error
}
enum class FirstState : State {
//some states
}
enum class NextState: State {
//some states
}
enum class LastState: State {
//some states
}
在我的服务中,我有:
when (state) {
is FirstState -> {
//do something
changeFirstStateOperationState(state)
}
is NextState -> {
//do something
changeNextStateOperationState(state)
}
is LastState -> {
//do something
changeLastStateOperationState(state)
}
}
private fun changeFirstStateOperationState(state: FirstState){
when(state){
FirstState.A -> OperationState.Error
listOf(FirstState.B, FirstState.C) -> OperationState.InProgress
FirstState.D -> OperationState.Finished
}
}
我想将我当前的实现更改为密封类。 我试过类似的东西:
sealed class State {
sealed class OperationState : State() {
sealed class FirstState : OperationState() {
object A: FirstState()
object B: FirstState()
object C: FirstState()
object D: FirstState()
}
sealed class NextState:OperationState(){ ... }
sealed class LastState:OperationState(){ ... }
}
}
但它不起作用......
有没有什么办法,使用密封的类,知道什么是当前的 OperationStatus 而不映射到它?
【问题讨论】:
-
“不起作用”是什么意思?这编译得很好。请注意,如果密封类的每个子类都是
object,为了简单起见,应该首选使用枚举类。只有当子类型需要能够保持状态时,您才需要密封类。 -
您的
changeFirstStateOperationState()没有任何作用。它只是声明事物而不设置任何属性或返回任何内容。
标签: kotlin sealed sealed-class