Kotlin学习之类与对象篇—密封类

密封类(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()
  • 密封类默认是抽象的,它无法被直接实例化,能拥有抽象成员。
  • 密封类不允许有非private的构造函数,它的构造函数默认是private的。
  • 注意继承密封类子类的类可以放在任何地方,不必限于在同一个文件中。

密封类的关键好处在于当使用when表达式的时候。如果能确认语句覆盖了所有情况,就不必使用else语句。然而,这只有在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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值