【问题标题】:Check through all subclasses of a sealed class in Kotlin检查 Kotlin 中密封类的所有子类
【发布时间】:2021-04-20 13:05:20
【问题描述】:

我有一个包含球作为对象的密封类,用于台球游戏。在代码的其他地方,我使用了 BallType,它是一个枚举类。我希望能够在需要时通过提供球类型来获取球对象。有没有办法做到这一点?

enum class BallType { NOBALL, WHITE, RED, YELLOW, GREEN, BROWN, BLUE, PINK, BLACK, COLOR, FREE }

sealed class Ball(
    val BallType: BallType,
    val points: Int,
    val foulPoints: Int
) {
    object NOBALL: Ball(BallType.NOBALL, 0, 0)
    object WHITE: Ball(BallType.WHITE, 4, 4)
    object RED: Ball(BallType.RED, 1, 4)
    object YELLOW: Ball(BallType.YELLOW, 2, 4)
    object GREEN: Ball(BallType.GREEN, 3, 4)
    object BROWN: Ball(BallType.BROWN, 4, 4)
    object BLUE: Ball(BallType.BLUE, 5, 5)
    object PINK: Ball(BallType.PINK, 6, 6)
    object BLACK: Ball(BallType.BLACK, 7, 7)
    object COLOR: Ball(BallType.COLOR, 7, 7)
    object FREE: Ball(BallType.FREE, 1, 4)
}

fun getBall(ballType: BallType) : Ball {
    // I am stuck here
}

【问题讨论】:

  • 仅使用when 并检查所有类型。但是您的结构似乎可以改进,因为在这种情况下您只需要枚举而不需要密封类?
  • 您能解释一下我该如何改进吗?对不起,我是初学者。

标签: android android-studio class kotlin sealed-class


【解决方案1】:

这可以通过使用枚举来大大简化。由于您所有的 Ball 子类都是无状态的,因此它们是多余的。所以你可以像这样设置你的枚举:

enum class Ball(
    val points: Int,
    val foulPoints: Int
) {

    NO_BALL(0, 0),
    ...
}

但是,要回答您的具体问题,不可能简洁地做到这一点(并且没有反思),您必须手动完成:

return when (ballType) {

    NO_BALL -> Ball.NoBall
    ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多