密封类

作者: 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)

相关文章

  • 12.Kotlin泛型与协变及逆变原理剖析

    1.密封类 密封类(sealed class)①密封类用来表示受限的类继承结构,对密封类中的某个值来说,它所属类型...

  • 密封类

    密封类:断子绝孙 如果我们的类是密封类,那么就意味着不能有任何派生类。 但是密封类是可以拥有父类 C#中密封类使用...

  • 密封类,密封方法

    密封:sealed 对于类,不能被继承(任何类都不能继承) 对于方法不能被重写。 “sealed”,只能写在重写的...

  • 密封类

    using System; namespace _密封类 { class MainClass { public s...

  • 密封类

    密封类的关键词为sealed 他是一种特殊的抽象类,无法被实例化。 它的构造函数是private的,这将使其只能在...

  • Kotlin 密封类 Sealed的总结

    概念sealed修饰的类 在kotlin中是密封类 密封类 描述的是 父类和子类的关系1、密封类和它的子类必须定义...

  • Android MVI 设计模式(3)

    我们用 kotlin 的 sealed 类密封一些数据类,kotlin 提供的密封类类似于枚举,密封类用于定义一种...

  • Kotlin学习之密封类

    Kotlin学习之密封类 密封类是Kotlin中的一个高级类,有如下特点: 密封类是为继承设计的,是一个抽象类; ...

  • kotlin sealed密封类

    kotlin中sealed关键字修饰的类就是密封类。密封类其实是一种特殊的抽象类,专门用于派生子类的。 密封类的特...

  • C#之 sealed(密封类和密封方法)

    1,密封类 密封类可以用来限制扩展性,当在程序中密封了某个类时,其他类不能从该类继承,可防止对垒进行自定义。 2,...

网友评论

    本文标题:密封类

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