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

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

文章目录

I . 密封类概念

II . 密封类声明

III. 密封类注意事项

IV . 密封类 示例代码



I . 密封类概念


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



2 . 密封类与枚举类 :



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


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




II . 密封类声明


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


sealed class Student{}


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


sealed class Student {
    class GoodStudent : Student()
}


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




III. 密封类注意事项


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



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



3 . 密封类子类 :



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


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



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



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




IV . 密封类 示例代码


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("其它情况")
}


执行结果 :


学习很好
读书
学习一般
静坐
学的很渣
打游戏


目录
相关文章
|
12月前
|
Java Kotlin
Kotlin data数据类、copy()函数、sealed密封类
Kotlin data数据类、copy()函数、sealed密封类使用
112 0
|
8月前
|
存储 Kotlin
Kotlin中嵌套类、数据类、枚举类和密封类的详解
Kotlin中嵌套类、数据类、枚举类和密封类的详解
65 1
|
IDE 编译器 开发工具
深入学习 Kotlin 特色之 Sealed Class 和 Interface
深入学习 Kotlin 特色之 Sealed Class 和 Interface
|
IDE Java 编译器
Kotlin 1.5 新特性:密封接口比密封类强在哪?
Kotlin 1.5 推出了密封接口(Sealed Interface),这与密封类(Sealed Class)有什么区别呢?
343 0
Kotlin 1.5 新特性:密封接口比密封类强在哪?
|
搜索推荐 安全 JavaScript
【Kotlin 初学者】枚举类-密封类-数据类-继承(下)
三、数据类 3.1 创建数据类 3.2 toString、equals和hashCode的个性化实现 3.3 ==符号 3.4 copy() 函数 3.5 解构声明 四、 继承(extend) 4.1 Any 超类 4.2 继承类 4.3 函数重写 4.4 属性重写 4.5 类型检测(is)
239 0
【Kotlin 初学者】枚举类-密封类-数据类-继承(下)
|
Kotlin
【Kotlin 初学者】枚举类-密封类-数据类-继承(上)
目录 一、枚举类 1.1 创建枚举类 1.2 获取枚举相关信息 1.3 枚举类添加属性 1.4 定义函数 1.5 以泛型的方式访问枚举类中的常量 1.6 代数数据类型(ADT) 二、密封类(sealed class) 2.1 创建密封类 2.2 使用
292 0
【Kotlin 初学者】枚举类-密封类-数据类-继承(上)
DHL
|
前端开发 算法 Java
Kotlin 密封类进化了
这是 Sealed Classes(密封类)系列的第三篇文章,之前的文章从原理、优化、实战以不同的角度分别介绍了 Sealed Classes 的强大。
DHL
231 0
Kotlin 密封类进化了
DHL
|
设计模式 前端开发 算法
Kotlin 中的密封类 优于 带标签的类
今天这篇文章,我们主要从类层次结构来讨论一下 Sealed Classes(密封类) 和 Tagged Classes(标记类)的优缺点。在开始分析之前,我们先介绍一下什么是 Tagged Classes(标记类)以及都有那些缺点。
DHL
143 0
Kotlin 中的密封类 优于 带标签的类
DHL
|
存储 算法 前端开发
Kotlin Sealed 是什么?为什么 Google 都用
在上一篇文章 Google 推荐在项目中使用 Sealed 和 RemoteMediator 中介绍了如何使用 Sealed Classes 在 Flow 基础上对网络请求成功和失败进行处理,而这篇文章是对 Sealed Classes 更加深入的解析,结合函数式编程功能很强大,掌握并且灵活运用它,需要大量的实践。
DHL
194 0
Kotlin Sealed 是什么?为什么 Google 都用
|
Java Android开发 C++
【Android NDK 开发】Kotlin 语言中使用 NDK ( 创建支持 Kotlin 的 NDK 项目 | Kotlin 语言中使用 NDK 要点 | 代码示例 )(二)
【Android NDK 开发】Kotlin 语言中使用 NDK ( 创建支持 Kotlin 的 NDK 项目 | Kotlin 语言中使用 NDK 要点 | 代码示例 )(二)
171 0
【Android NDK 开发】Kotlin 语言中使用 NDK ( 创建支持 Kotlin 的 NDK 项目 | Kotlin 语言中使用 NDK 要点 | 代码示例 )(二)