子类类型有限的class
印章类和枚举的区别:
sealed class 更在意类型
枚举更在意数据
枚举:
enum class Week {
星期一,星期二,星期三,星期四,星期五,星期六,星期日
}
使用:
println(Week.星期一)
sealed class
学生分2种,好学生和坏学生。但是只要是学生,都会有学习这个行为
/**
* 印章类
*
* 学生类
*
* 好学生、差学生
*/
sealed class Student {
fun study() {
println("study")
}
//学生类型下的好学生类型
class goodStudent() : Student()
//学生类型下的坏学生类型
class badStudent() : Student()
}
创建并调用方法:
/*
*直接写下面这句,会报错:
*Cannot access '<init>': it is private in 'Student'
*Sealed types cannot be instantiated
*/
//var s = Student()
var s1=Student.goodStudent()
s1.study()
var s2=Student.badStudent()
s2.study()
打印日志:
I/System.out: study
I/System.out: study
可是,好学生和坏学生,学习的方法和状态那些都不一样,修改Student下的代码如下
/**
* 印章类
*
* 学生类
*
* 好学生、差学生
*/
sealed class Student {
open fun study() {
println("study")
}
//学生类型下的好学生类型
class goodStudent() : Student() {
override fun study() {
println("goodStudent,study")
}
fun goodStudy(){
println("goodStudy")
}
}
//学生类型下的坏学生类型
class badStudent() : Student() {
override fun study() {
println("badStudent,study")
}
fun badStudy(){
println("badStudy")
}
}
}
调用:
/*
*直接写下面这句,会报错:
*Cannot access '<init>': it is private in 'Student'
*Sealed types cannot be instantiated
*/
//var s = Student()
var s1=Student.goodStudent()
s1.study()
s1.goodStudy()
var s2=Student.badStudent()
s2.study()
s2.badStudy()
日志如下:
I/System.out: goodStudent,study
I/System.out: goodStudy
I/System.out: badStudent,study
I/System.out: badStudy