密封类
Kotlin官网:Classes and Objects-Sealed Classes
密封类和枚举类相似,也是用来限制类型的范围。
和枚举类不同的是,枚举类是单例的,密封类可以创建多个实例。
要声明为密封类,使用sealed
关键字修饰类名。
密封类可以被继承,所有的继承子类必须和密封类声明在一个文件中。
sealed class Expr
data class Const(val number: Double) : Expr()
data class Sum(val e1: Expr, val e2: Expr) : Expr()
object NotANumber : Expr()
上例中用到了Kotlin1.1的新特性:数据类可以继承其他类,包括密封类。
密封类默认是抽象的,不可以被实例化,可以有抽象的成员。
密封类的所有构造函数都必须是private的,默认既是private。
继承密封类子类的类(间接继承)不受“必须同文件”限制,随意声明在任何地方都可以。
密封类的最大优势是在when表达式中使用。
fun eval(expr: Expr): Double = when(expr) {
is Const -> expr.number
is Sum -> eval(expr.e1) + eval(expr.e2)
NotANumber -> Double.NaN
// the `else` clause is not required because we've covered all the cases
}