簡體   English   中英

密封類擴展其他密封類

[英]sealed class extends other sealed class

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM