ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
参考:[扩展](http://www.kotlincn.net/docs/reference/extensions.html#%E6%89%A9%E5%B1%95) ## 拓展函数 [TOC] ### 定义 Kotlin的标准库给我们提供了大量的类,类里面提供了大量的方法。但是,实际开发过程中,具体的某一个类,仅仅通过系统提供的方法远远不能满足需求。**通过 扩展 声明完成一个类的新功能 扩展 ,而无需继承该类或使用设计模式(例如,装饰者模式)。** 使用Java开发的时候,我们可以通过继承类或者通过代理模式,可以对某一个类做增强。使用Kotlin开发,这一切变的简单。Kotlin允许拓展方法,只需要按照给定的语法格式,可以很方便的对某一个类添加方法。 ### 怎么定义拓展函数 那拓展函数怎么定义呢?通过如下格式定义: ~~~ fun AnyClass.functionName(params):receiveType{ method body } ~~~ * AnyClass:任意类 * functionName:拓展函数的函数名 * params:拓展函数的参数 * receiverType:拓展函数的返回值类型 * method body:拓展函数的方法体 假如,假如我们**想获取字符串最后一个字符**,如果**用Java语言,我们可能需要会定义一个StringUtils的类,然后写一个getLastChar的方法**,代码如下: ![](https://box.kancloud.cn/697c7e551b30caf0b73b2d1db87846e2_689x618.png) 同样的逻辑,**如果在Kotlin里面,就是通过拓展函数的形式去实现了**,参考代码: ![](https://box.kancloud.cn/2f4101bb4ec20fa58645dd8a94c1f2b7_680x379.png) ### 拓展函数使用注意 **Java里面,父类和子类有相同方法的时候,子类方法优先**。这是多态的表现,通过一个代码给大家回顾下,参考代码: ![](https://box.kancloud.cn/71feeca1137f84839c1c216da9406d46_675x797.png) 那如果Kotlin里面,子类和父类拥有同名的拓展方法会是怎样呢?**Kotlin的拓展函数则不存在子类优先的原则,Kotlin的拓展函数是静态解析(没有多态)的,完全由当前变量的类型决定**。参考代码: ![](https://box.kancloud.cn/96b54f4fd19bbbb85fee406f54af5f7c_688x610.png) 那**如果Kotlin里面,类本身的成员函数和拓展函数同名会怎样呢?Kotlin的拓展函数针对成员函数和拓展函数同名问题,遵循成员函数优先的原则**。参考代码: ![](https://box.kancloud.cn/8a20c4a08785caaf7393703c207d6da9_679x633.png) ## 拓展属性 ### 定义 Kotlin的标准库给我们提供了大量的类,类里面提供了大量的属性。但是,实际开发过程中,具体的某一个类,仅仅通过系统提供的属性可能不能满足需求。 使用Java开发的时候,我们可以通过继承类或者通过代理模式,可以对某一个类做增强。使用Kotlin开发,这一切变的简单。**Kotlin允许拓展属性,只需要按照给定的语法格式,可以很方便的对某一个类添加属性**。 ### 怎么定义拓展属性 那拓展函数怎么定义呢?通过如下格式定义: ~~~ val/var AnyClass.propertiesName: propertiesType getter setter ~~~ * AnyClass:任意类 * propertiesName:拓展属性名字 * propertiesType:拓展属性类型 * getter:拓展属性的getter方法 * setter:拓展属性的setter方法 **假如我们想“获取字符串最后一个字符”**,我们除了用开始的拓展函数去实现,**还可以使用拓展属性**,参考案例: ![](https://box.kancloud.cn/8ca17f4890f48638aa1aa8c201f67d71_690x348.png)   ## 拓展函数编辑技巧 ![](https://box.kancloud.cn/5e1614543ba089be9e0e343b9c37525d_711x265.gif)