封闭类(Sealed Classes)用于代表严格的类结构,值只能是有限集合中的某中类型,不可以是任何其
它类型。这就相当于一个枚举类的扩展:枚举值集合的类型是严格限制的,但每个
枚举常量只有一个实例,而密封类的子类可以有包含不同状态的多个实例。
声明密封类需要在 class 前加一个 sealed 修饰符。密封类可以有子类但必须全部嵌
套在密封类声明内部
使用封闭类的主要好处是when表达式,不需要在使用else形式了
// 封闭类(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()
fun eval(expr:Expr):Double = when(expr)
{
is Const -> expr.number
is Sum -> eval(expr.e1) + eval(expr.e2)
NotANumber ->Double.NaN
}
fun main(args: Array<String>)
{
var mConst1 = Const(20.0)
var mConst2 = Const(15.2)
var mSum = Sum(mConst1,mConst2)
println(eval(mConst1))
println(eval(mConst2))
println(eval(mSum))
}
输出:
20.0
15.2
35.2