05-密封类
7.2 密封类
当定义的类是限定类型中的一种时,可以使用密封类表示受限的类。从某种意义上来说,密封类是枚举类的扩展类型:枚举类型值的限定集合。枚举类型只能包含单独的实例,而密封类的子类可以包含状态的多个实例。
声明密封类时,需要在类名前加上sealed修饰符。密封类可以有子类,但所有子类都必须内嵌在密封类中。
sealed class Expr
data class Const(val number: Double) : Expr()
data class Sum(val e1: Expr, val e2: Expr) : Expr()
object NotANumber : Expr()
自1.1版本开始,数据类可以直接继承密封类,继承的密封子类可以位于任何地方,而不仅仅是在同文件中。
因为密封类是自身抽象的,所以不能使用它直接实例化有抽象成员的对象,也就是说不能使用sealed关键字修饰interface和abstract类。
密封类的一个核心功能就是在使用when表达式时,如果验证语句能够覆盖所有情况,则无须在条件语句中添加else代码块。
fun eval(expr: Expr): Double = when(expr) {
is Const -> expr.number
is Sum -> eval(expr.e1) + eval(expr.e2)
NotANumber -> Double.NaN
//此处不再需要else子句,因为已经覆盖了所有的情况
}