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

  • 2020-01-14 00:12:22

    webpack externals详解

    在众多的webpack配置教程中,对externals这个配置选项,总是一带而过,把文档中提到的几种方式都复述一遍,但是对于开发者而言,根本没法完全理解。本文试图通过一整篇文章,详细的对externals这个参数进行讲解。

  • 2020-01-14 01:06:37

    webpack externals 深入理解

    按照官方文档的解释,如果我们想引用一个库,但是又不想让webpack打包,并且又不影响我们在程序中以CMD、AMD或者window/global全局等方式进行使用,那就可以通过配置externals。这个功能主要是用在创建一个库的时候用的,但是也可以在我们项目开发中充分使用。

  • 2020-01-14 01:08:19

    webpack用externals优化echarts

    防止将某些 import 的包(package)打包到 bundle 中,而是在运行时(runtime)再去从外部获取这些扩展依赖(external dependencies)。

  • 2020-01-16 08:52:22

    Vue函数式调用组件创建公共组件

    所有组件都需要这么去调用,就会有些许麻烦而且不太美观。像Loading、Toast等这些组件,一页面可以经常用到而且每次显示的内容都可能不一样,这样的话用js的方式【this.$xxx.show(option)】去调用就方便很多,而且代码也更整洁。

  • 2020-01-17 08:37:26

    css transition分别指定多个属性

    transition有四个属性,很多人都会遗忘,分别是transition-property,transition-duration,transition-timing-function,transition-delay,尤其是transition-delay,这个可以实现延迟动画