密封类

  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) {
    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) {
    print(SealedClass2())//打印 "in SealedClass2"
    print(OuterChildren()) //打印 "in OuterChildren name=doulala"
}

密封类 vs 枚举类型

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

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

  3. 枚举类型是语法支持

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

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

你可能感兴趣的:(密封类)