前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Kotlin】Kotlin Sealed 密封类 ( 密封类声明 | 密封类子类定义 | 密封类特点 | 代码示例 )

【Kotlin】Kotlin Sealed 密封类 ( 密封类声明 | 密封类子类定义 | 密封类特点 | 代码示例 )

作者头像
韩曙亮
发布2023-03-27 19:00:30
1.2K0
发布2023-03-27 19:00:30
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

I . 密封类概念

1 . 密封类作用 : 定义一个密封类 , 该类只能有有限个指定的子类 , 不能在其它文件定义其它类型子类 ;

2 . 密封类与枚举类 :

① 相同点 ( 类型限制 ) : 从类型种类角度对比 , 类与枚举类类似 , 枚举类的值的集合是受限制的 , 不能随意扩展 ;

② 不同点 ( 对象个数限制 ) : 从每个类型对象个数对比 , 枚举类的每个类型只能存在一个实例 , 而密封类的每个类型可以创建无数个实例 ;

II . 密封类声明

1 . 密封类声明 : 在 class 前添加 sealed 修饰符 , 即可将该类声明为密封类 ;

代码语言:javascript
复制
sealed class Student{}

2 . 子类声明 : 密封类的子类 , 必须定义在密封类的内部 ; ( 1.1 之后的版本可以定义在同一个文件中 )

代码语言:javascript
复制
sealed class Student {

    class GoodStudent : Student()
}

为了版本兼容 , 还是定义在密封类内部吧 ;

III. 密封类注意事项

1 . 抽象类本质 : 密封类本质是抽象类 , 其类型不能被实例化 , 只能实例化其子类 ;

2 . 私有构造函数 : 密封类的构造函数默认是 private 私有的 , 其构造函数必须是私有的 , 不允许非私有构造函数存在 ;

3 . 密封类子类 :

① 定义在密封类内部 ( 推荐 ) : 密封类的子类建议定义在密封类内部 , 可以兼容所有版本 ;

② 定义在密封类所在文件 : Kotlin 1.1 以后的版本 , 可以将密封类子类定义在密封类声明的同一个文件中 ;

4 . 密封类孙子类 : 密封类子类也可以被继承 , 其孙子类没有继承限制 , 可以在其它类中继承定义 ;

5 . when 语句 : 在 when 语句中判定 , 必须有 else 其它情况进行兜底 , 但是判定密封类子类时 , 如果 when 中列举了所有的密封类子类 , 此时可以不写 else 分支 , 详情看下面的示例代码 ;

IV . 密封类 示例代码

代码语言:javascript
复制
package sealed

sealed class Student {

    /**
     * 注意 : 只有被 open 修饰的函数才能被 override 重写
     */
    open fun study(){
        println("学习")
    }

    /**
     * 子类 1
     */
    class GoodStudent : Student(){
        override fun study() {
            println("学习很好")
        }

        fun read(){
            println("读书")
        }
    }

    /**
     * 子类 2
     */
    class NormalStudent : Student(){
        override fun study() {
            println("学习一般")
        }

        fun seat(){
            println("静坐")
        }
    }

    /**
     * 子类 3
     */
    class BadStudent : Student(){
        override fun study() {
            println("学的很渣")
        }

        fun play(){
            println("打游戏")
        }
    }

}

fun main() {

    // 1 . 测试密封类子类 1


    var goodStudent : Student.GoodStudent = Student.GoodStudent()

    //学习很好
    goodStudent.study()
    //读书
    studentAction(goodStudent)


    //2 . 测试密封类子类 2


    var normalStudent : Student.NormalStudent = Student.NormalStudent()

    //学习一般
    normalStudent.study()
    //静坐
    studentAction(normalStudent)


    //3 . 测试密封类子类 3
    

    var badStudent : Student.BadStudent = Student.BadStudent()

    //学的很渣
    badStudent.study()
    //打游戏
    studentAction(badStudent)


}

/**
 * 根据不同的类型执行不同的方法
 */
fun studentAction(student : Student) = when(student){

    //如果已经覆盖了 3 个子类 , 即所有的情况 , 此时可以不需要定义 else 语句
    is Student.GoodStudent -> student.read()
    is Student.BadStudent -> student.play()
    is Student.NormalStudent -> student.seat()

    //else -> println("其它情况")
}

执行结果 :

代码语言:javascript
复制
学习很好
读书
学习一般
静坐
学的很渣
打游戏
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-03-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
    • I . 密封类概念
      • II . 密封类声明
        • III. 密封类注意事项
          • IV . 密封类 示例代码
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档