Kotlin学习笔记--枚举和Sealed Class(密封、印章类型)

子类类型有限的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

猜你喜欢

转载自blog.csdn.net/u014620028/article/details/78522516