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

  • 2017-07-26 11:57:00

    Laravel 定时任务

    在 php 中使用定时器是一件不太简单的事情,之前大概只能通过 cron 来实现定时任务。但是在 Laravel5 中,定时任务将会变得很简单。

  • 2017-08-03 21:16:46

    Node.js 里面那些遗失的 ES6 特性

    其实 Node.js 对 ES6 的很多特性都已经开始支持了。 在 Node.js 使用的 JS 引擎 V8 里面将不同状态 ES6 特性分成了 3 个等级:

  • 2017-08-08 11:17:17

    nginx 反向代理 取得真实IP和域名

    nginx反向代理后,在应用中取得的ip都是反向代理服务器的ip,取得的域名也是反向代理配置的url的域名,解决该问题,需要在nginx反向代理配置中添加一些配置信息,目的将客户端的真实ip和域名传递到应用程序中。

  • 2017-08-09 15:14:52

    如何写好.babelrc?Babel的presets和plugins配置解析

    官网是这么说的,翻译一下就是下一代JavaScript 语法的编译器。 作为前端开发,由于浏览器的版本和兼容性问题,很多JavaScript的新的方法都不能使用,等到可以大胆使用的时候,可能已经过去了好几年。Babel就因此而生,它可以让你放心使用大部分的JavaScript的新的标准的方法,然后编译成兼容绝大多数的主流浏览器的代码。