Kotlin实现多函数接口的简化调用
对于一个声明了多个方法的接口,我们使用的时候有时仅仅关注于几个关键方法,并不需要实现所有的。可是由于接口调用的语法限制,使得我们不得不在代码中也显示声明实现了那些我们不关心的方法。在Java中也有简化接口调用的方式,比如安卓中ViewPager监听页面切换时的接口PageChangeListener,官方提供了简单类: ViewPager.SimpleOnPageChangeListener来简化调用。
对于Kotlin来说,可以类似使用java的方式,来实现多函数接口的简化调用,只是要用到object关键字且代码仍会较多。这里,由于Kotlin的语法更为灵活,去实现这种调用应该有其特色的方式,使得代码更少,且更加具有张力。
来个小例子,先简单介绍类似java实现多函数接口的简化调用,一是展示什么是简化接口调用,二是做对比。这里得例子都用kotlin写的。
1.声明接口CallBack 和调用类Worker
interface CallBack { fun onSuccess(str: String) fun onFailure(code: Int) } class Worker { var callback: CallBack? = null fun done(str: String) { callback?.onSuccess(str) } fun fail(code: Int) { callback?.onFailure(code) } fun setCallBack(lis: CallBack) { callback = lis; } }
2.直接调用接口,使用了object关键字 ,此时假设不关心success方法,但必须显示声明。
Worker().apply { setCallBack(object : CallBack { override fun onSuccess(str: String) { } override fun onFailure(code: Int) { toast("$code") } }) }.fail(110) //结果:吐司:110
3.Java风格简化调用,声明简化类SimCallBack
public class SimCallBack implements CallBack{ @Override public void onSuccess(@NotNull String str) { } @Override public void onFailure(int code) { } }
4.Java风格简化调用的展示,不关心的onSuccess不用再显示声明
Worker().apply { setCallBack(object : SimCallBack() { override fun onFailure(code: Int) { super.onFailure(code) toast("$code") } }) }.fail(110)
上述带着浓浓java味道的调用,不仅代码风格比较混杂,而且代码显得冗余。重点来了,Kotlin怎么去克服上面两点呢。看例子。
1.还是CallBack接口,不过其简化类需要用Kotlin风格来做:
class SimpleCallBack : CallBack{ private var _OnSucess: ((str: String) -> Unit)? = null fun success(listener: (str: String) -> Unit) { _OnSucess = listener } override fun onSuccess(str: String) { _OnSucess?.invoke(str) } private var _OnFailure: ((code: Int) -> Unit)? = null override fun onFailure(code: Int) { _OnFailure?.invoke(code) } fun fail(listener: (code: Int) -> Unit) { _OnFailure = listener } }
声明了两个函数类型变量 _OnSucess和 _OnFailure,作用就是内部将原来的大接口CallBack分解。然后声明了对应的方法success和fail,目的是给变量小接口赋值。接着就是原接口方法的处理,比如原接口方法onSuccess(str: String)的操作 _OnSucess?.invoke(str),目的是实现接口回调结果的转移。做这些,目的就是为以后的简化调用做准备。
2.调用类Worker 也是要进行处理一下的,代码基本同原来的那些,只是增加了以下方法。注意,若不是为了兼容java方式,原setCallBack可以不再声明,直接赋值就好,由此,新增方法可以看做是原setCallBack方法的替换。
fun setCallBacker(listener: SimpleCallBack.() -> Unit) { var ca = SimpleCallBack() ca.listener() setCallBack(ca) }
注意名称。本方法接受一个函数参数,方法的作用是内部生成一个简化接口对象SimpleCallBack,然后再让调用类注册到接口。然后执行传进来的函数参数,为什么要这样呢,是为了使用kotlin语法中灵活的闭包{}。另外,配上强大的函数扩展语法,不改变原有类,增加个这种方法还是比较容易的。
3.最后看看调用方式吧:
Worker().apply { setCallBacker { success { toast(it) } fail { }//若不需要,可以不显示声明 } }.done("完成") //结果:吐司:完成
最后结果可以看出,当调用多函数接口CallBack时,并不需要再声明接口,而是直接在闭包里声明想要使用的方法,然后在对应的方法闭包里执行操作即可。风格完全是kotlin,且使用特别简便。
分享结束,希望对读者有所帮助。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
- Kotlin中常见内联扩展函数的使用方法教程
- 玩转Kotlin 彻底弄懂Lambda和高阶函数
- 详解Kotlin 高阶函数 与 Lambda 表达式
- Kotlin 内联函数详解及实例
- Kotlin基础教程之函数定义与变量声明
- Kotlin基础教程之Run,标签Label,函数Function-Type
- Kotlin基础教程之dataclass,objectclass,use函数,类扩展,socket
- Kotlin语法学习-变量定义、函数扩展、Parcelable序列化等简单总结
- Kotlin教程之函数和包的定义和流程控制
- Kotlin中let()with()run()apply()also()函数的使用方法与区别
- Kotlin实现多函数接口的简化调用
- 如何在linux C/C++语言中调用 sqlite 的函数接口来实现对数据库的管理(转)
- CXF整合spring框架实现动态调用,找不到函数接口, 添加拦截器无法初始化
- (转)如何在linux C/C++语言中调用 sqlite 的函数接口来实现对数据库的管理
- C#利用接口实现窗体间函数调用
- 利用MySQL自带的C API函数实现数据库功能调用
- 函数API调用,COM组件接口调用和SOA服务调用
- Inside VCL:接口指针调用函数的时候,如何获得对象指针以完成函数调用?
- 《Effective C#》Item 20:区分接口实现与虚函数重载
- 调用API的SDK相关知识:实现回调函数.
- [导入]修改VS2008代码重构模板简化接口属性成员实现
- 利用动态创建自动化接口实现VB的函数指针调用
- ICallbackEventHandler接口实现无刷新调用后台
- 利用动态创建自动化接口实现VB的函数指针调用
- 利用ICallbackEventHandler接口实现异步调用
- 批处理实现函数调用
- 简化的查询分析器,删除的实现,定制的排序,应用接口的扩展
- Inside VCL:接口指针调用函数的时候,如何获得对象指针以完成函数调用?
- JavaScript实现二级、多级(N级)联动下拉列表框更新版,支持IE6,FireFox,函数和类两种调用方式,支持到N级,非常通用。
- Effective C# 原则20:明辨接口实现和虚函数重载的区别(译)