Sealed class密封类详解

 一:密封类的定义

 在类名之前使用sealed关键字将类声明为密封类。
 密封类仅在编译时限制类型集来确保类型安全的重要性。
 密封类隐式是一个无法实例化的抽象类。

二:密封类所具有的特性和与别的类具有不同之处

 ①Sealed class(密封类) 是一个有特定数量子类的类,看上去和枚举有点类似,所不同的是,在枚举中,我们每个类型只有一个对象(实例);而在密封类中,同一个类可以拥有几个对象。

②Sealed class(密封类)的所有子类都必须与密封类在同一文件中

③Sealed class(密封类)的子类的子类可以定义在任何地方,并不需要和密封类定义在同一个文件中

④Sealed class(密封类)没有构造函数,不可以直接实例化,只能实例化内部的子类

三:如何获取密封类里面的函数方法

 只能创建密封类子类对象 通过密封类的子类对象调用密封类里的函数方法

 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())
}

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值