内容简介
委托是 Kotlin 中新引入的一种东东,它能给我们开发中带来很多的便利,接下来由我给大家揭开它的面纱,并且给大家提供几种好用的实战经验。
类委托
在 Kotlin
中若类实现某接口,我们可以通过 by
关键字,将其委托给已实现该接口的对象作为自己的实现。
大侠别慌!🌰这就送上!
类委托实例
委托类的实现步骤:
定义一个
ICode
接口定义
Code
类实现ICode
接口,并创建一个Code
对象。需要委托的类
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