文章目录
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("其它情况") }
执行结果 :
学习很好 读书 学习一般 静坐 学的很渣 打游戏