一:密封类的定义
在类名之前使用sealed关键字将类声明为密封类。 密封类仅在编译时限制类型集来确保类型安全的重要性。 密封类隐式是一个无法实例化的抽象类。
二:密封类所具有的特性和与别的类具有不同之处
①Sealed class(密封类) 是一个有特定数量子类的类,看上去和枚举有点类似,所不同的是,在枚举中,我们每个类型只有一个对象(实例);而在密封类中,同一个类可以拥有几个对象。
②Sealed class(密封类)的所有子类都必须与密封类在同一文件中
③Sealed class(密封类)的子类的子类可以定义在任何地方,并不需要和密封类定义在同一个文件中
④Sealed class(密封类)没有构造函数,不可以直接实例化,只能实例化内部的子类
三:如何获取密封类里面的函数方法
只能创建密封类子类对象 通过密封类的子类对象调用密封类里的函数方法
扫描二维码关注公众号,回复:
17624650 查看本文章

sealed class SealedClass{
class SealedClass1():SealedClass()
class SealedClass2():SealedClass()
fun hello(){
println("Hello World ... ")
}
}
只能通过密封类内部的子类实例化对象,这时就可以执行里面的方法了
fun main(args:Array<String>){
var sc:SealedClass = SealedClass.SealedClass1()
sc.hello()
}
四:
密封类通常与表达when时一起使用。 由于密封类的子类将自身类型作为一种情况。 因此,密封类中的when表达式涵盖所有情况,从而避免使用else子句。
sealed class MyColor {
class Yellow : MyColor()
class Red : MyColor()
class Black : MyColor()
}
fun evals(color: MyColor) =
when (color) {
is MyColor.Yellow -> println("yellow")
is MyColor.Red -> println("red")
is MyColor.Black -> println("black")
}//todo 不需要使用else了
fun main(args: Array<String>) {
evals(MyColor.Black())
}
五:密封类里面可以有若干个子类,这些子类如果要继承密封类,则必须和密封类在同一个文件里
sealed class LicenseStatus2 {
//单例继承密封类
object UnQualified : LicenseStatus2()
//单例继承密封类
object Learning : LicenseStatus2()
//子类继承密封类
class Qualified(val licenseId: String) : LicenseStatus2()
}
class Driver2(var status: LicenseStatus2) {
fun checkLicense(): String {
return when(status){
is LicenseStatus2.UnQualified -> "没资格"
is LicenseStatus2.Learning -> "在学"
is LicenseStatus2.Qualified -> "有资格,驾驶证编号:${(this.status as LicenseStatus2.Qualified).licenseId}"
}
}
}
fun main() {
val status = LicenseStatus2.Qualified("238239329")
val driver = Driver2(status)
println(driver.checkLicense())
}