Android

kotlin 类委托 “by” 关键字

2018-12-31  本文已影响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

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

上一篇下一篇

猜你喜欢

热点阅读