О запечатанном подклассе запечатанного класса в Kotlin - PullRequest
0 голосов
/ 19 января 2020

код ниже компилируется, пока невозможно go через условия Color.Dark и Color.Light, поскольку эти два класса абстрактны.

Я что-то пропустил?

sealed class Color () {
  sealed class Dark () {
    class DarkRed : Color()
    class DarkBlue : Color()
    }   
  sealed class Light {
    class LightRed : Color()
    class LightBlue : Color()
    }
}   

fun eval(c: Color) =
        when (c) {
        is Color.Dark -> println("Dark")
            is Color.Dark.DarkRed -> println("Dark Red")
            is Color.Dark.DarkBlue -> println("Dark Blue")

        is Color.Light -> println("Light")
            is Color.Light.LightRed -> println("Light Red")
            is Color.Light.LightBlue -> println("Light Blue")
}

fun main(args: Array<String>) {
    val dr = Color.Dark.DarkRed()
    eval(dr)
}

1 Ответ

2 голосов
/ 19 января 2020

Два левых отступа никогда не выполняются, потому что Color.Dark и Color.Light не наследуют Color, а не потому, что они абстрактны. Это означает, что 2 из 6 is веток бесполезны, их можно смело удалять. Но остальные 4 ветви (is Color.Dark.DarkRed, et c.) go через все Color подклассы, а Color является запечатанным классом, поэтому when может использоваться без else ветви.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...