【问题标题】:sealed class extends other sealed class密封类扩展了其他密封类
【发布时间】:2021-12-15 21:48:33
【问题描述】:

我在使用 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
}

【问题讨论】:

    标签: kotlin extends sealed-class


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-24
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多