kotlin - 密封类扩展了其他密封类
问题描述
我在使用 MVI 模式时制作各种状态模型和副作用类。状态模型可以通过扩展收集公共部分的接口来减少样板,但是副作用类不支持扩展,因为它是一个密封类。所以我将 Toast 的副作用视为样板代码。我怎样才能摆脱这个 Toast 副作用样板代码?密封类有没有办法扩展到其他密封类?
我的州课:
interface BaseMviState {
val loaded: Boolean
val exception: Exception?
fun isException() = exception != null
}
data class MviJoinState(
override val loaded: Boolean = false,
override val exception: Exception? = null,
val loginResult: Boolean = false,
val registerResult: Boolean = false,
) : BaseMviState
data class MviRoomCreateState(
override val loaded: Boolean = false,
override val exception: Exception? = null,
) : BaseMviState
我的副作用类:
sealed class MviJoinSideEffect {
data class SetupAutoLogin(val user: User) : MviJoinSideEffect()
data class Toast(val message: String) : MviJoinSideEffect() // boilerplate
}
sealed class MviRoomCreateSideEffect {
data class Toast(val message: String) : MviRoomCreateSideEffect() // boilerplate
}
解决方案
我通过在密封类中扩展接口来解决这个问题,如下所示:
sealed interface BaseEvent {
data class Toast(val toastMessage: String) : BaseEvent
}
sealed class Event : BaseEvent {
data class Snackbar(val snackbarMessage: String) : Event()
}
fun main() {
val event: BaseEvent = Event.Snackbar("Hi")
when (event) {
is BaseEvent.Toast -> todo(event.toastMessage)
is Event.Snackbar -> todo(event.snackbarMessage)
}
}
fun todo(message: String) {}
推荐阅读
- javascript - 无法将从 reader.result 获得的字符串分配给变量,返回 null
- node.js - 如何使用firebase admin sdk获取downloadUrl firebase存储并使用multer将img html的标签放入nodejs中?
- c# - “顶级语句必须在命名空间和类型声明之前”
- git - 有没有办法只跳过 commit-msg 钩子
- yarnpkg - Windi CSS HMR 不适用于 Svelte + vite 应用
- apache-spark - 循环文件夹内的文件并使用数据块将数据加载到增量表中
- reactjs - React/Typescript:我如何通过多个组件向下传递和“键入”道具
- android - 如何用 Map 调用函数
onmessage 中的消息在颤动中侦听远程消息的属性 - python - Python在第一列之后的3个空格开始的第二列中左对齐文本
- c++ - 如何让 C++ 更喜欢将 char* 转换为 string_view 而不是 bool?