美文网首页Android
kotlin 类委托 “by” 关键字

kotlin 类委托 “by” 关键字

作者: 笔云客 | 来源:发表于2018-12-31 11:17 被阅读0次

在扩展一个类并重写某些方法时,你的代码就变得依赖你自己继承的那个类的实现细节了。当你的基类的实现被修改或者新方法被添加进去,你做出的类行为的假设会失效,所以你的代码也许最后就会以不真确的行为告终。
因为有以上原因,kotlin的默认类都被修饰 final 不可更改的。
实现:by 委托,它的实现思想其实跟设计模式中的装饰器模式一样
如:

// 定义一个接口,和一个方法 show()
interface Base {
fun show()
}

// 定义类实现 Base 接口, 并实现 show 方法
open class BaseImpl : Base {
override fun show() {
print("BaseImpl::show()")
}
}

// 将Base中所有的实现都委托给base 对象,这个类本身就不需要去实现Base接口中的方法
class BaseProxy(base: Base) : Base by base

// main 方法
fun main(args: Array<String>) {
val base = BaseImpl()
BaseProxy(base).show()
}
分析:每次在实现接口时,都需要实现接口中的所有方法,by也就是将 Base 接口中需要实现的
方法都委托给BaseImpl 类去实现,所以这里这样写 :Base by base 其实也就是说,我实现了接口
Base,但我本身不实现Base接口中的方法,委托给base帮我实现,那么在调用的时候就传入有具体实现了Base接口的类,方便我们的委托。
这里:
// 传入了BaseImpl类的引用,BaseImpl 必须是实现了Base接口的类
val base = BaseImpl()
// 传入了BaseImpl类的引用,这里在调用的时候也是调用BaseImpl中的方法
BaseProxy(base).show()

/* 在这里就把整个接口的实现委托给 持有 base 引用的类去实现接口Base中具体的方法
不代表Base接口在其他地方一定要有被其他实体类实现了才可以使用by 委托,即使在其他地方没
有实现Base 接口也可以使用 Base接口的对象去委托 */
class BaseProxy(base: Base) : Base by base

总结:
原理:代码中的的重要思想也就是我们面向对象中最难理解的多态
多态的三大特征是(继承,封装,实现)

相关文章

  • Kotlin 委托

    Kotlin 委托 1. 类委托 在 Kotlin 中用 by 关键字来表示委托 1. 类委托的第一种实现方式 T...

  • kotlin语法糖以及原理

    kotlin by关键字实现委托属性与委托类 委托类 需要注意的是: CountingSet3 必须实现一个接口,...

  • Kevin Learn Kotlin:委托

    Kotlin 通过关键字 by 实现委托。 类委托 类的委托即一个类中定义的方法实际是调用另一个类的对象的方法来实...

  • kotlin 类委托 “by” 关键字

    在扩展一个类并重写某些方法时,你的代码就变得依赖你自己继承的那个类的实现细节了。当你的基类的实现被修改或者新方法被...

  • 常用工具类

    CommonUtils 工具类 常用工具类 添加依赖 kotlin扩展/委托 sharePreferences委托...

  • Kotlin-类委托(delegation)

    Kotlin-类委托(delegation) 我们用Java可以实现委托的功能,但是在Kotlin这个语言直接就已...

  • Kotlin中的类委托和属性委托

    Kotlin的委托可分为类委托和属性委托。 一、类委托 类委托是代理模式的应用,而代理模式可以作为继承的一个不错的...

  • Kotlin by

    kotlin 中的委托模式依靠by关键字,语法定义 val/var :by ...

  • Kotlin for android学习八:委托

    前言 kotlin官网和kotlin教程学习教程的笔记。 一、类的委托 背景:委托模式是类继承模式之外的另一种很好...

  • 【kotlin】委托

    在 kotlin 开发中,会遇到懒加载的情形:使用 by lazy 关键字。而这是通过委托来实现的。Kotlin ...

网友评论

    本文标题:kotlin 类委托 “by” 关键字

    本文链接:https://www.haomeiwen.com/subject/gcuilqtx.html