kotlin中sealed关键字修饰的类就是密封类。密封类其实是一种特殊的抽象类,专门用于派生子类的。
密封类的特点
密封类的子类是固定的
密封类的直接子类必须和密封类在同一个文件中
密封类间接的子类可以在不同文件中
密封类所有的构造方法都是private的
如下程序定义了一个密封类和3个子类:
// 声明一个密封类:在类定义前用关键字 sealed 来修饰。
sealed class DreamCar {
//驾驶感受
abstract fun drive();
//档次
fun grade() {
println("档次如何呢?")
}
open class BenZCar : DreamCar() {
override fun drive() {
println("奔驰豪华牛逼")
}
}
open class BMWCar : DreamCar() {
override fun drive() {
println("宝马操控牛逼")
}
}
open class AudiCar : DreamCar() {
override fun drive() {
println("奥迪四驱牛逼")
}
}
fun testDreamCar(dreamCar: DreamCar) {
when(dreamCar) {
is BenZCar -> dreamCar.drive()
is BMWCar -> dreamCar.drive()
is AudiCar -> dreamCar.drive()
else -> null
}
}
}
密封类间接的子类可以在不同文件中,如下:
class BMWSeries3Car : DreamCar.BMWCar() {
override fun drive() {
super.drive()
println("年轻人绕不开一辆宝马3系")
}
}
密封类就像在写嵌套类,也像是在写枚举类。密封类是枚举类的扩展,每个枚举常量只有一个实例,而密封类的一个子类有可包含状态的多个实例。也就是说,对密封类的子类进行多次实例化产生多个不同的实例,而这个在枚举类中是无法实现的。
网友评论