简体   繁体   English

密封类扩展其他密封类

[英]sealed class extends other sealed class

I am making various state models and side effect classes while using the MVI pattern.我在使用 MVI 模式时制作了各种状态模型和副作用类。 The state model can reduce the boilerplate by extending the interface that collects common parts, but the side effect class does not support extends as it is a sealed class.状态模型可以通过扩展收集公共部分的接口来减少样板,但副作用类不支持扩展,因为它是一个密封类。 So I see the Toast side effect as boilerplate code.所以我将 Toast 副作用视为样板代码。 How can I get rid of this Toast side effect boilerplate code?我怎样才能摆脱这个 Toast 副作用样板代码? Is there any way for the sealed class to extend to other sealed classes?密封类有没有办法扩展到其他密封类?

My state classes:我的状态类:

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

My side effect classes:我的副作用类:

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
}

I solved this problem by extending the interface in a sealed class like this:我通过在这样的密封类中扩展接口解决了这个问题:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM