美文网首页
每天学一点 Kotlin -- 多彩的类:密封类

每天学一点 Kotlin -- 多彩的类:密封类

作者: 冯可乐同学 | 来源:发表于2021-11-20 13:19 被阅读0次

----《第一季Kotlin崛起:次世代Android开发 》学习笔记

总目录:每天学一点 Kotlin ---- 目录
上一篇:每天学一点 Kotlin -- 多彩的类:数据类
下一篇:每天学一点 Kotlin -- 多彩的类:泛型

1. 密封类

1.1 密封类主要在里面封装了各种各样的类,也就是说,它是一个大容器,在里面放了一个又一个的类元素,这些元素就像容器类内部的属性一般,我们可以把类当作这个容器的组成部分。

1.2 声明一个密封类:在类定义前用关键字 sealed 来修饰。

2. 举个栗子:

2.1 不使用密封类的情况下:

open class FruitForSealed{}

class AppleForSealed : FruitForSealed(){
    fun operate() = println("我是一个苹果")
}
class BananaForSealed : FruitForSealed(){
    fun operate() = println("我是一个香蕉")
}
class WaterMelonForSealed : FruitForSealed(){
    fun operate() = println("我是一块西瓜")
}

fun testFruitForSealed(fruit: FruitForSealed){
    when(fruit){
        is AppleForSealed -> fruit.operate()
        is BananaForSealed -> fruit.operate()
        is WaterMelonForSealed -> fruit.operate()
        else -> null
    }
}

fun main() {
    val f = BananaForSealed()
    testFruitForSealed(f)
}

打印结果:

我是一个香蕉

2.2 使用密封类的情况:

sealed class FruitForSealed1{
    class Apple: FruitForSealed1(){
        fun operate() = println("this is apple")
    }

    class Banana: FruitForSealed1(){
        fun operate() = println("this is banana")
    }

    class Pair: FruitForSealed1(){
        fun operate() = println("this is pair")
    }
}

fun testFruitForSealed01(){

    val fruit1 = FruitForSealed1.Apple()
    fruit1.operate()

    val fruit2 = FruitForSealed1.Banana()
    fruit2.operate()
}

fun main() {
    testFruitForSealed01()
}

打印结果:

this is apple
this is banana

可以看出,使用密封类里面的类和普遍类是一样的。

2.3 给上面的类定义一个总的操作函数:

sealed class FruitForSealed1 {
    class Apple : FruitForSealed1() {
        fun operate() = println("this is apple")
    }

    class Banana : FruitForSealed1() {
        fun operate() = println("this is banana")
    }

    class Pair : FruitForSealed1() {
        fun operate() = println("this is pair")
    }
}

fun testFruitOperate1(fruit: FruitForSealed1) = when (fruit) {
    is FruitForSealed1.Apple -> fruit.operate()
    is FruitForSealed1.Banana -> fruit.operate()
    is FruitForSealed1.Pair -> fruit.operate()
}

fun main() {
    val f = FruitForSealed1.Pair()
    testFruitOperate1(f)
}

打印结果:

this is pair

函数传入的参数没有变化,而且内部仍然是 when 表达式,但是和 2.1 相比,不需要 else 语句了。因为在 when 中说明了 Apple,Banana 和 Pair 类对应的操作,也就是把容器里面的小类型全部列举了,不会再有其他的情况了。

2.4 在 Kotlin1.1 之后,密封类还可以用继承的写法:

sealed class FruitForSealed2 {}

class AppleForSealed2 : FruitForSealed2() {
    fun operate() = println("我是一个 AppleForSealed2")
}

class BananaForSealed2 : FruitForSealed2() {
    fun operate() = println("我是一个 BananaForSealed2")
}

class WaterMelonForSealed2 : FruitForSealed2() {
    fun operate() = println("我是一块 WaterMelonForSealed2")
}

2.5 密封类就像在写嵌套类,也像是在写枚举类。当然,这些都是互通的,不过还是有区别的:密封类是枚举类的扩展,每个枚举常量只有一个实例,而密封类的一个子类有可包含状态的多个实例。也就是说,对密封类的子类进行多次实例化产生多个不同的实例,而这个在枚举类中是无法实现的。

相关代码:https://gitee.com/fzq.com/test-demo

相关文章

网友评论

      本文标题:每天学一点 Kotlin -- 多彩的类:密封类

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