封闭类(Sealed Classes)

封闭类(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

猜你喜欢

转载自blog.csdn.net/yulu5216/article/details/80190860
今日推荐