首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >密封类扩展了其他密封类

密封类扩展了其他密封类
EN

Stack Overflow用户
提问于 2021-11-01 03:09:28
回答 1查看 99关注 0票数 1

在使用MVI模式时,我正在创建各种状态模型和副作用类。状态模型可以通过扩展收集公共部分的接口来减少样板,但副作用类不支持扩展,因为它是一个密封的类。所以我把Toast的副作用看作是样板代码。我怎样才能摆脱这个Toast副作用样板代码?有没有办法让密封的类扩展到其他密封的类?

我的状态类:

代码语言:javascript
复制
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

我的副作用类:

代码语言:javascript
复制
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
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-03 12:51:08

我通过在一个密封的类中扩展接口解决了这个问题:

代码语言:javascript
复制
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) {}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69792256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档