Kotlin ENUM类具有由代理实现的通用接口

时间:2018-03-20 20:13:02

标签: enums delegates kotlin

这是一个稍微抽象的问题,关于找到一个漂亮的设计方法,只需要最少的样板。

先决条件:

  • 我有一个用于枚举各种提供者的ENUM类,即:enum class Provider { Google, Microsoft }
  • 假设有一个服务接口interface Foo { fun getMail(): Mail }将针对每个特定提供商实施。

我很好奇是否有办法以实现接口Provider的方式定义ENUM类Foo,之后我可以指定每个具体提供程序将由哪些对象实现?

我想知道是否可以有一个无样板的方法来定义具体接口的枚举类,而我可以稍后定义将实现具体提供程序的对象。

先决条件并不牢固所以如果更好的设计需要更改,那么我渴望得到更好的建议。

1 个答案:

答案 0 :(得分:4)

是的

您可以使枚​​举实现接口。

enum class Provider(val mail: Mail) : Foo {
    Google(googleMail),
    Microsoft(microsoftMail);

    override fun getMail(): Mail = mail // Or this.mail
}

interface Foo { fun getMail(): Mail }

然后你访问

Provider.Google.getMail()

其他方式是使用val成员

interface Foo { val mail: Mail }

enum class Provider(override val mail: Mail) : Foo {
    Google(googleMail),
    Microsoft(microsoftMail)
}

并访问

Provider.Google.mail