Kotlin-委托、代理和单例对象

227 阅读2分钟

委托和代理

实现委托和代理,使用的是by关键字。
这里设计一个场景:假设某个演员被要求唱歌,但是不会唱歌,就委托一个会唱歌的歌手在后台唱歌。
如何实现这个需求,下面就开始直接写代码
首先定义一个唱歌能力接口

interface Ising {
    fun singing()
}

然后创建一个歌手对象,实现这个唱歌接口

class SingerA:Ising {
    override fun singing() {
        println("歌手甲正在努力唱歌")
    }
}

然后在定义一个演员对象,并且用by关键字委托歌手唱歌。

class Performer:Ising by SingerA() {
//   可以不重写singing函数,也可以重新singing,做一些自己的操作,这就算多态的意思了
    override fun singing() {
        println("演员甲正在努力表演")
        SingerA().singing()
    }
}

下面在main函数调用演员的唱歌

fun main(args: Array<String>) {
    val performer = Performer()
    performer.singing()
}
//运行结果为:
//演员甲正在努力表演
//歌手甲正在努力唱歌

object关键字-单例对象

上面的代码有一个坑,重写的时候SingerA().singing()这种调用方式,就等于又创建了一个新的歌手对象调用了唱歌函数。
Kotlin提供了一个关键字object。用object关键字代替class声明对象,这个对象就是单例的,也就是编译运行的时候直接在内存创建了一个全局唯一的对象。
下面是使用object定义对象的代码:

object SingerA:Ising {
    override fun singing() {
        println("歌手甲正在努力唱歌")
    }
}

因为歌手对象使用了object声明,所以委托歌手的时候就不能带括号了
下面是委托歌手需要修改的代码

class Performer:Ising by SingerA {
    override fun singing() {
        println("演员甲正在努力表演")
        SingerA.singing()
    }
}

本文转自 blog.csdn.net/DK_long_ten…,如有侵权,请联系删除。