-
密封类
的关键词为sealed
- 他是一种特殊的
抽象类
,无法被实例化。 - 它的构造函数是
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 枚举类型
-
枚举类型
与密封类
都是为了实现有限集中的值或者类型 -
密封类
其实是通过继承
+private constructor
的组织实现 -
枚举类型
是语法支持 -
密封类
可以支持子类的多属性
与多方法
,这些都是枚举类型
无法完成的 -
密封类
仍然存在外部扩展的可能性,可以通过对子类的继承,完成对类型的扩展。(其实就是继承玩的6)
网友评论