委托和代理
实现委托和代理,使用的是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()
}
}