kotlin - 密封类扩展了其他密封类

标签 kotlin extends sealed-class

我正在使用 MVI 模式制作各种状态模型和副作用类。状态模型可以通过扩展收集公共(public)部分的接口(interface)来减少样板代码,但是副作用类不支持扩展,因为它是一个密封类。所以我将 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

我的副作用类(class):

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
}

最佳答案

我通过在密封类中扩展接口(interface)解决了这个问题,如下所示:

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) {}

关于kotlin - 密封类扩展了其他密封类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69792256/

相关文章:

java - 在Kotlin中结合反射、枚举和泛型,类型推断失败,但我也不知道

android - 如何使用 Fuel for Kotlin 发布多部分/表单数据?

gradle - 如何运行 ktor 应用程序?

Typescript 有条件扩展嵌套对象

java - 扩展可序列化的地理点 - 无法读回对象

kotlin - 如何在这个密封的类层次结构中摆脱这个样板代码?

android - 当前选择的 Java 调试器不支持类型为 'Kotlin Line Breakpoints' 的断点

java - 从扩展类中覆盖 compareTo - 发生了什么?

generics - 将泛型类型传递给嵌套密封类