当前位置:嗨网首页>书籍在线阅读

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子句,因为已经覆盖了所有的情况
}