密封类

作者: doulala | 来源:发表于2017-12-31 01:26 被阅读21次
    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)

    相关文章

      网友评论

        本文标题:密封类

        本文链接:https://www.haomeiwen.com/subject/ivhogxtx.html