密封类

  1. 密封类的关键词为sealed
  2. 他是一种特殊的抽象类,无法被实例化。
  3. 它的构造函数是private的,这将使其只能在同一个文件中被使用,无法随意的扩展
sealed class SealedClassSimple(var name: String) { }//密封类定义,默认的抽象类,无法被

class SealedClass1(name: String, var age: Int) : SealedClassSimple(name) { // 子类1,可以定义自己的属性
    fun print(): Unit {
        System.out.println("in SealedClass1: name=${name} age=${age}")
    }
}

class SealedClass2() : SealedClassSimple("doulala") { //子类2
    fun print(): Unit {
        System.out.println("in SealedClass2 name=${name}")
    }

}
fun print(printer: SealedClassSimple) { //打印类
    when (printer) {
        is SealedClass1 -> printer.print()
        is SealedClass2 -> printer.print()
    }
}

fun main(args: Array<String>) {
    print(SealedClass1("doulala", 18)) //打印  "in SealedClass1: name=doulala age=18 "
    print(SealedClass2())//打印 "in SealedClass2 name=doulala"
}

密封类的类型扩展

密封类本身对外部范围文件是不可见的,但是其子类是对外可见的:

File1.kt

open class SealedClass2() : SealedClassSimple("doulala") {  //对外开放的子类
    open fun print(): Unit {
        System.out.println("in SealedClass2 name=${name}")
    }
}

File2.kt

class OuterChildren : SealedClass2() {   //定义外部的子类,继承,并重写方法
    override fun print(): Unit {
        System.out.println("in OuterChildren name=${name}")
    }
}

fun print(printer: SealedClassSimple) {

    when (printer) {
        is SealedClass2 -> printer.print()
        is OuterChildren -> printer.print() //OuterChildren也因为继承链的原因,属于SealClassSimple的类型 
    }
}

fun main(args: Array<String>) {
    print(SealedClass2())//打印 "in SealedClass2"
    print(OuterChildren()) //打印 "in OuterChildren name=doulala"
}

密封类 vs 枚举类型

  1. 枚举类型密封类都是为了实现有限集中的值或者类型

  2. 密封类其实是通过继承+private constructor的组织实现

  3. 枚举类型是语法支持

  4. 密封类可以支持子类的多属性多方法,这些都是枚举类型无法完成的

  5. 密封类仍然存在外部扩展的可能性,可以通过对子类的继承,完成对类型的扩展。(其实就是继承玩的6)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 大家好,我是William李梓峰,欢迎加入我的Kotlin学习之旅。今天是我学习 Kotlin 的第十四天,内容是...
    William李梓峰阅读 3,863评论 -1 2
  • 数据类 我们经常创建一些只保存数据的类。在这些类中,一些标准函数往往是从数据机械推导而来的。Kotlin 中使用关...
    郎官人阅读 4,657评论 0 0
  • 欢迎关注 二师兄Kotlin转载请注明出处 二师兄kotlin 密封类用来表示受限的类继承结构:当一个值为有限集中...
    RidingWind2023阅读 4,819评论 0 1
  • 我们总以为死亡是敌人,要对抗它;即使知道它是必然,却要延迟它的到来。 却忽略了,死亡可以是朋友,是我们力量的源泉。...
    颜满媛阅读 1,222评论 0 0
  • 那时 我怀揣着童真的梦站在春天里 春风拂过那时的蓝天 拂过那时的白云 拂过那时的大地 也拂过那时的我 , 春风拂过...
    草芥人阅读 1,436评论 0 0