【问题标题】:Some derived classes with pre-defined values whilst others not一些具有预定义值的派生类,而另一些则没有
【发布时间】:2018-09-19 13:55:24
【问题描述】:

在我的 Kotlin 应用程序中,我处理了一些成员类型。例如:

interface MembershipType {
    fun getExcessOptions(): List 
}

派生类型为GOLDSILVERBRONZEPLATNIUM

所有 4 种类型都有多余选项列表。例如:

enum class MembershipType(val name: String) : IValueOptions {
    SILVER("silver") {
        override fun getExcessOptions() = listOf(300,200,100)
    }, //for GOLD, BRONZE, PLATNIUM etc

对于GOLDSILVER 类型,它们可以选择为Bundle,因此它们必须具有可以从中选择的预定义valueOptions 列表。

对于BRONZEPLATNIUM,它们只能是Named,所以用户输入自己的值,他们可以选择..

基本上我想代表以下内容:

MemeberShip Type || Options           || Value Options
GOLD             || Bundle            || 100, 200, 3000
SILVER           || Bundle and Named  || 4000, 5000
PLATINUM         || Named
BRONZE           || Named


data class Bundle (
        val excess: Int
        val value: Int
) 

data class Named (
        val excess: Int
        val value: Int
) 

data class Selection(val bundle : Bundle?, val items : List<Named>)

我如何在 Kotlin 中用类和继承来表示这一点,甚至作为枚举,因为其中两种类型在它们具有预定义 valueOptions 属性的意义上是独一无二的?

【问题讨论】:

  • 所以应该例如:GOLD 允许 Budle 类型的对象具有列出的值而没有别的?也许它只是我,但很难遵循你真正想要实现的目标/模型这看起来可能是密封类的一个很好的用例
  • @Nikky - 而不是“GOLD 允许 Bundle 类型的对象”,它应该是“您可以选择 GOLD 或 SILVER 类型的 Bundle”

标签: inheritance design-patterns kotlin


【解决方案1】:

也许这可以给你一个起点

sealed class MembershipType(val label: String) {
    abstract val excessOptions: List<Int>
    object GOLD: MembershipType("GOLD"), OtherInterface {
        override val excessOptions= listOf(100, 200, 3000)
        override val foo = "bar"
    }
    object SILVER: MembershipType("SILVER"), OtherInterface {
        override val excessOptions= listOf(4000, 5000)
        override val foo = "baz"
    }
}

interface OtherInterface {
    val foo: String
}

密封类就像类和枚举的结合, 你不能再从外部扩展密封类,每个对象都可以扩展不同的接口

可以在文档中找到更多相关信息:https://kotlinlang.org/docs/reference/sealed-classes.html

【讨论】:

  • 我也在想sealed classes,到目前为止你的答案已经显示出来了。我只是在为BundleMembershipTypes 之间的关系而苦苦挣扎。基本上,我允许用户选择 GOLD 或 SILVER 类型的 Bundle,只有这两个。 OtherInterface 是否应该类似于 BundleOption 并让类型 GOLDSILVER 实现它?当我构造Bundle 时,我希望填充excess 之一和values 之一
  • 构造Selection
  • MembershipType 在您的情况下可能是通用的以支持不同的选项类型。但是SIlVER 仍然存在问题,应该包含 2 种类型。
  • SILVER可以实现其他类型的接口吗?
  • 确保它可以实现多个接口并组合它需要的部分
猜你喜欢
  • 1970-01-01
  • 2014-11-30
  • 2021-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
  • 2018-01-27
相关资源
最近更新 更多