Kotlin 语法:Interface 和 委托以及 sealed class_子类

 

本文适合有 java 基础的同学,有学习 kotlin 的同学欢迎一起来,有问题可在文末留言。

场景描述

现在有一个项目需要外包出去,于是就找了中间人,负责将项目外包并按期交付,而这个中间人就获得了第一个项目报价,而中间人又不会写代码,于是,他去找了程序员,给出了第二次报价,就等着接收项目交付结果了。
分析:
这里“发出需求的”就符合接口的含义(提供与外界事物交互实现某个操作而不影响其内部的其他功能),所以定义一个接口,中间人就可以抽象为代理商,而后面不管经过几首,都认为是写程序的人,这样就是一个代理形式场景,下面用 Kotlin 代码来实现。

接口定义

/**
 * 接口 有项目需要外包
 */
interface GetMoneyFromProject {
    fun wbProject()
}

说明:在 Kotlin 中定义接口,依然使用 interface 关键字。

代理人定义

/**
 * 将 ProgrammerTwo 修改为始终单实例
 *
 * 需要将类 ProgrammerTwo 的 class 替换为 object 修饰符
 *
 */
class ProgrammerOne : GetMoneyFromProject by ProgrammerTwo {
    override fun wbProject() {
        println("我是中间人,我负责项目的外包和初次验收工作")
        // 只有一个实例,不再需要使用构造方法方法其函数
        ProgrammerTwo.wbProject()
    }
}

说明:这里的“代理人”类实现了“需要项目被外包的人”接口,并通过关键字 by 委托这件事情给“写代码的程序员”去做。自己实现了接口中的方法,说明一些外包的具体的事宜,比如,何时开始项目实施,何时收工,以及报款等等操作。

程序员类

/**
 * 最后写代码的程序员
 *
 * object 可保证该实例在内存中只有一个
 */
object ProgrammerTwo : GetMoneyFromProject {
    override fun wbProject() {
        println("到这是二手了,报价2W.可以赚外快了")
    }
}

说明:这里的类 ProgrammerTwo 被关键字 object 所修饰,也就意味着在定时的时候就创建了一个对象,也就是单例的体现,该类的成员可通过类名类访问。

运行结果:

fun main(args: Array<String>) {
    var p1 = ProgrammerOne()
    p1.wbProject()
}
// 运行结果
我是中间人,我负责项目的外包和初次验收工作
到这是二手了,报价2W.可以赚外快了

说明:场景具体用代码实现。这里注意几个细节:

  • 类实现接口依然使用 :

  • 接口后面不需要括号

  • 委托使用关键字 by

  • 类定义单例(唯一实例)使用 object 修饰

sealed class 密封类

sealed 类,为父类添加一个 sealed 修饰符,对可能创建的子类做出严格的限制。所以子类必须嵌套在父类中,也就是说密封类不能再去外部拥有子类。需要注意:被 sealed 所修饰的类,默认就是一个 open 类,不再需要显示地添加 open 。下面以之前学习过的 when 表达式举例说明:

/**
 * sealed 关键字所修饰的类:
 *
 * 其子类默认不能出现在其外部;默认是 open
 */
sealed class Company {
    class PM(var elevel: Int) : Company()
    class Programmer(var ide: String) : Company()
}
fun test(c: Company) {
    when (c) {
        is Company.PM -> println(c.elevel)
        is Company.Programmer -> println(c.ide)
        // 这里列举完了所有情况,所有 else 分支可以不写
    }
}
fun main(args: Array<String>) {
    var company1 = Company.PM(5)
    var company2 = Company.Programmer("IDEA")
    test(company1)
    test(company2)
}

说明:如果我们不适用 sealed 来定义类,而是使用接口的形式,那么我们的表达式 when 则必须有默认分支 else ,否则编译器报错,但是如果使用 sealed 来修饰,因为限定了数量,所以无需写 else 分支。

enum 枚举

// 定义枚举
enum class Weeks {
    星期日, 星期一, 星期二, 星期三, 星期四, 星期五, 星期六
}

枚举和密封类的区别

枚举:重点强调数据,可列举,统一使用。
sealed calss:重点强调数量,突出对数量的限制。

 


说件事情

  • 初创的技术+生活圈子现在加入人数没有上限了,想加入的在公众号底部菜单自行加入。有什么问题可在哪里随时提问,发表状态。

  • 年前本公众号会做一次送书活动,书籍会有热门的人工智能,架构,编程语言,条件很简单,只要你经常留言啊,点赞啊,分享文章啊之类的,总之能活跃在每篇文章的视线范围内,就有机会优先获得。

 

 

Kotlin 语法:Interface 和 委托以及 sealed class_子类_02