检查 Kotlin 中密封类的所有子类

问题描述

我有一个包含球作为对象的密封类,用于台球游戏。在代码的其他地方,我使用的是 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)
    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)
    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)
    object FREE: Ball(BallType.FREE,4)
}

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

解决方法

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

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

    NO_BALL(0,0),...
}

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

return when (ballType) {

    NO_BALL -> Ball.NoBall
    ...
}