Kotlin第十五讲---强大的委托机制

内容简介

委托是 Kotlin 中新引入的一种东东,它能给我们开发中带来很多的便利,接下来由我给大家揭开它的面纱,并且给大家提供几种好用的实战经验。

类委托

在 Kotlin 中若类实现某接口,我们可以通过 by 关键字,将其委托给已实现该接口的对象作为自己的实现。

cf9e7a5b3bdbc851d312259628767ebe.gif

大侠别慌!🌰这就送上!

6714313203301eb395e2a91dd783795b.jpeg

类委托实例

委托类的实现步骤:

  1. 定义一个 ICode 接口

  2. 定义 Code 类实现 ICode 接口,并创建一个 Code 对象。

  3. 需要委托的类 CodePeople 实现 ICode 接口,并通过 by 关键字委托给创建的 Code 对象。

/**
 * 定义人类
 */
open class People(val name: String) {
    fun eat() {
        println("$name  chifan ")
    }
    fun sleep() {
        println("$name  sleep")
    }
}
/**
 * 定义程序员接口
 */
interface ICode {
    fun coding()
}
/**
 * 可以写代码技能
 */
class Code(val name: String) : ICode {
    override fun coding() {
        println("$name  写代码")
    }
}
/**
 * 可以看到,我通过接口加 by 关键字,来进行了一次委托
 */
class CodePeople(name: String) : People(name), ICode by Code(name)
fun main() {
    /**
     * 创建 CodePeople 对象
     */
    val codePeople = CodePeople("阿文")
    /**
     * 调用吃饭睡觉方法
     */
    codePeople.eat()
    codePeople.sleep()
    /**
     * 调用委托过来的方法
     */
    codePeople.coding()
}

通过上面的代码,我们发现 codePeople 对象,既能调用父类 People 的方法,也能调用到委托的 Code 的 coding 方法。
大伙有没有感觉,通过这种曲线救国的方式,有一点像多继承的感觉呀?我们继续尝试能否重写 coding 方法吗?多态性质能体现出来吗?

class CodePeople(name: String) : People(name), ICode by Code(name){
    override fun coding() {
        println("$name  写牛逼的代码")
    }
}
/**
  * 多态
  */
 val code: ICode = CodePeople("阿文")
 code.coding()

发现是可以重写 coding 方法,且多态的性质也能体现,越来越像多继承的感觉了。

这里要注意:若 Code 类中的属性是无法委的,类委托只能委托接口中定义的方法。还是和继承有比较大的区别的(仔细想想多继承也不可能存在)。

类委托的本质

Java 是不可能存在委托的概念的, Kotlin 是在 Java 的基础上建立的帝国,所以也不能丢了根本,类委托是如何实现的呢?为何只能委托&重写接口定义的方法呢?具备多态性质,为何属性不能委托呢?
我们来反编译看看 CodePeople 类的实现。

public final class CodePeople extends People implements ICode {
   // $FF: synthetic field
   private final Code $$delegate_0;
   public CodePeople(@NotNull String name) {
      Intrinsics.checkPara
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值