0

我在这里看到了很多枚举方法的接口示例,但我正在寻找另一件事。

我想确保一些字符串枚举至少有三个键:

enum InterstitialEnum(val webName: string) {
    Showed("interstitialShowed"),
    Dismissed("interstitialDismissed"),
    Failed("interstitialFailed"),
    SomeInterstititalValue("intersititalSomeValue")
}

enum VideoEnum(val webName: string) {
    Showed("videoShowed"),
    Dismissed("videoDismissed"),
    Failed("videoFailed"),
    VideoSomethingHere("videoSomethingHere")
}

我的最终目标是将该接口用作函数参数,以便我可以访问 functionParameter.Showed.webName等。

我试图创建一个接口,但我找不到定义函数的方法ShowedDismissed或者Failed只是函数。

这不起作用

interface BaseEnum {
    val FailedToShow: String;
}

编辑:

重要的是,这不是如何在 Kotlin 中扩展枚举的副本?因为我不想要相同的key/value对,我想要相同key的不同的value.

4

2 回答 2

2

您不能使用不同的枚举来执行此操作,因为没有将不同枚举的枚举实例的名称关联起来的机制。

这是与您正在寻找的结构相似的东西的想法。

interface WebNames {
    val showed: String
    val dismissed: String
    val failed: String
}

object InterstitialWebNames: WebNames {
    override val showed: String = "interstitialShowed"
    override val dismissed: String = "interstitialDismissed"
    override val failed: String = "interstitialFailed"
}

object VideoWebNames: WebNames {
    override val showed: String = "videoShowed"
    override val dismissed: String = "videoDismissed"
    override val failed: String = "videoFailed"
}

如果您有其他属性,则可以为这些属性使用包装类而不是字符串。

于 2021-04-25T15:07:40.640 回答
1

我认为@TenFour04 的示例是您将获得的最接近的示例。您可以将 aenum视为一种类型, and Showed,DismissedFailed作为子类型 - 但无法强制特定超类型必须具有特定名称的特定子类型集。

如果您不只是想处理String属性(例如,您可以做类似的事情,if (state is Showed)那么您可以为此创建一个类型:

open class State(val webName: String)
class Showed(webName: String) : State(webName)
class Dismissed(webName: String) : State(webName)
class Failed(webName: String) : State(webName)

interface WebNames {
    val showed: Showed
    val dismissed: Dismissed
    val failed: Failed
}

object VideoWebNames : WebNames {
    override val showed = Showed("videoShowed")
    override val dismissed = Dismissed("videoDismissed")
    override val failed = Failed("videoDismissed")
    // a State that's not a standard one included in the interface
    val videoSomethingHere = State("videoSomethingHere")
}

如果您愿意,可以将所有必需的状态粘贴在一个密封的类中,将它们组合在一起,然后可能会进行一些检查

open class State(val webName: String)

sealed class RequiredState(webName: String) : State(webName)
class Showed(webName: String) : RequiredState(webName)
class Dismissed(webName: String) : RequiredState(webName)
class Failed(webName: String) : RequiredState(webName)

所以现在videoWebNames.showed是一个Stateis Showedis RequiredState

于 2021-04-25T17:47:29.807 回答