Kotlin Sealed class类详解

2020-11-21 20:41:51

参考地址 Kotlin学习之路--Sealed class类详解

在上一篇 Kotlin学习之路–面向对象 中我们介绍了Kotlin类和接口的使用方法,这些类的使用与Java的有相似的概念,而今天介绍一下Kotlin的Sealed类(密封类),这是在Java中没有的概念

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

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

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

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

Sealed class使用场景一

我们先写一个密封类

sealed class SealedClass{
    class SealedClass1():SealedClass()
    class SealedClass2():SealedClass()
    fun hello(){
        println("Hello World ... ")
    }
}1234567

这时候我们想调用SealedClass里面的Hello方法怎么调用

fun main(args:Array<String>){    var sc:SealedClass = SealedClass()//这里直接编译报错}123

正确的使用姿势:

fun main(args:Array<String>){    var sc:SealedClass = SealedClass.SealedClass1()//只能通过密封类内部的子类实例化对象,这时就可以执行里面的方法了
    sc.hello()
}1234

Sealed class使用场景二

sealed class Mathematics(){
    data class Dou(val number: Double) : Mathematics()
    data class Sub(val e1: Mathematics, val e2: Mathematics) : Mathematics()
    object NotANumber : Mathematics()

    fun eval(m: Mathematics): Double = when(m) {        is Dou -> {
            m.number
        }        is Sub -> eval(m.e1) - eval(m.e2)
        NotANumber -> Double.NaN
    }
}

fun main(args:Array<String>){
    var ec1:Mathematics = Mathematics.Dou(5.0)
    var d1 = ec1.eval(ec1)
    println(d1)

    var ec2:Mathematics = Mathematics.Sub(ec1, Mathematics.Dou(3.0))
    var d2 = ec2.eval(ec2)
    println(d2)

    var ec3:Mathematics = Mathematics.NotANumber
    var d3 = ec3.eval(ec3)
    println(d3)
}

结果输出:5.02.0NaN123456789101112131415161718192021222324252627282930313233

  • 2019-09-08 21:45:31

    git index.lock

    因是在你进行某些比较费时的git操作时自动生成,操作结束后自动删除,相当于一个锁定文件,目的在于防止对一个目录同时进行多个操作。 有时强制关闭进行中的git操作,这个文件没有被自动删除,之后你就无法进行其他操作,必须手动删除,进入.git文件中删除,打开显示隐藏文件。如果没有看见.git文件夹,可以直接用命令rm -f ./.git/index.lock。之后就可以正常使用。 ———————————————— 版权声明:本文为CSDN博主「李瑞豪」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_39520417/article/details/81941111

  • 2019-09-09 05:28:54

    IntelliJ IDEA 进阶教程: 语言注入

    我真的太久没发 IntelliJ 的教程了,最近 Sakura 同学找我帮他配 IntelliJ ,我秀了一下技术,假装自己是老司机。 然后发现 Language Injection 这个非常好用的功能我居然没写教程(很明显,一堆人不知道这个东西), 于是我又开始写教程了。 本文多图。

  • 2019-09-09 05:32:55

    SrpingBoot 热启动与热部署

    当我们已经启动了一个服务,然后修改代码之后,会自动重新部署。Spring项目通常有新内容修改后需要重新编译然后运行。通过配置Spring boot的热启动配置,可以实现自动编译重启项目,通常要比手动停止,启动项目快。