Kotlin学习(14):密封类

  • 开发环境:IntelliJ IEDA
  • 个人博客:http://blog.csdn.net/IInmy
  • 项目源码:https://github.com/Rushro2m/KotlinForOfficial
  • 官方文档中文版:https://www.kotlincn.net/docs/reference/sealed-classes.html

密封类用来表示受限的类继承结构:当一个值为有限集的类型、而不能有任何其它类型时。在某种意义上,它们是枚举类的扩展:枚举类型的值集合也是受限制的,但每个枚举常量只存在一个实例,而密封类的一个子类可以有包含状态的多个实例。

要声明一个密封类,需要在类名前面添加sealed修饰符。虽然密封类也可以有子类,但是所有子类都必须在与密封类自身相同的文件中声明。

sealed class Expr

data class Const(val number: Double) : Expr()

data class Sum(val e1: Expr, val e2: Expr) : Expr()

object NotANumber : Expr()

fun eval(expr: Expr): Double = when (expr) {
    is Const -> expr.number
    is Sum -> eval(expr.e1) + eval(expr.e2)
    NotANumber -> Double.NaN
}

扩展密封类子类的类可以放在任何位置,无需在同一个文件中。

使用密封类的关键好处在于使用when表达式的时候,如果能够验证语句覆盖了所有情况,就不需要为该语句再添加一个else子句了。

fun eval(expr: Expr): Double = when (expr) {
    is Expr.Const -> expr.number
    is Expr.Sum -> eval(expr.e1) + eval(expr.e2)
    Expr.NotANumber -> Double.NaN
}

这里不再需要else子句,因为我们已经覆盖了所有的情况。

你可能感兴趣的:(Kotlin)