Kotlin-14.密封类(sealed class)

作者: lioilwin | 来源:发表于2017-08-07 21:18 被阅读155次

    官方文档: http://kotlinlang.org/docs/reference/sealed-classes.html

    密封类(sealed class)

    密封类: 受限的类继承结构(有限集合的类型,不能有任何其他类型)
    在某种意义上,密封类就是扩展的枚举类enum(枚举类的值集合也是受限)
    不同之处:
        枚举类的每个枚举常量只存在一个实例,
        密封类的一个子类可以有可包含状态的多个实例!
    
    密封类的所有子类都必须与密封类在同一文件中,
    密封类子类的子类(间接继承者)可以放在任何位置,无需在同一个文件中!
        //在Kotlin 1.1之前,该规则更加严格:子类必须在密封类的内部
        sealed class Expr {
            class Const(val number: Double) : Expr()
            class Sum(val e1: Expr, val e2: Expr) : Expr()
            object NotANumber : Expr()
        }
        //自Kotlin 1.1起,该规则放松
        sealed class Expr
        data class Const(val number: Double) : Expr()
        data class Sum(val e1: Expr, val e2: Expr) : Expr()
        object NotANumber : Expr()       
    
    密封类的好处在于:使用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子句,因为密封类是有限的,可以覆盖所有情况!
        }
    

    简书:http://www.jianshu.com/p/9bb644309cea
    CSDN博客: http://blog.csdn.net/qq_32115439/article/details/73612144
    GitHub博客:http://lioil.win/2017/06/22/Kotlin-sealed-class.html
    Coding博客:http://c.lioil.win/2017/06/22/Kotlin-sealed-class.html

    相关文章

      网友评论

      • 子寤:sealed class Letter
        object A:Letter()
        object B:Letter()

        fun eval(){
        val x=A
        when(x){
        A->println(A)
        B->println(B)
        }
        }
        这这时报错A,B是incompatible types,请问这时为什么?
        lioilwin:@子寤 估计kotlin直接推断x是A类型,但无法间接推断x基类Letter
        子寤: @lioilwin 多谢回复!不过很奇怪为什么会推断不出来
        lioilwin:@子寤 改成val x:Letter=A,你的写法 kotlin不知道x是Letter类型,所以编译器类型检查报错

      本文标题:Kotlin-14.密封类(sealed class)

      本文链接:https://www.haomeiwen.com/subject/bcfzlxtx.html