谁说接口不能有代码?—— Kotlin接口简介(KAD 26)

作者:Antonio Leiva

时间:Jun 6, 2017

原文链接:https://antonioleiva.com/interfaces-kotlin/

与Java相比,Kotlin接口允许你重用更多的代码。

原因非常简单:你能够向你的接口加代码。如果你已经试用过Java8,这非常类似。

能够在接口中包括代码的好处在于,你能够用更强大的方式使用组合。

Java 6的接口

Java接口的问题是我们仅仅能描述行为,但不能实现它。

这在许多情况下,这足够了。由于我们想实现一个很好的组合时,它会强制我们将这个接口的实现委托给个别对象,这样有些情况我们就无法解决。

也使得简单的组合类代码重用相当复杂。

Kotlin的接口

Kotlin给我们带来好消息:接口可以有代码。

这意味着我们可以实现一种多重继承(在某种程度上有限)。我们可以让一个类实现几个接口,并继承每个接口的行为。

要编写一个包含一些实现方法的接口,你不需要做任何特殊的是:

1 interface Interface1 {
2     fun function1() {
3         Log.d("Interface1", "function1 called")
4     }
5 }

另一个接口2实现另一功能:

1 interface Interface2 {
2     fun function2() {
3         Log.d("Interface2", "function2 called")
4     }
5 }

一个实现它们的类,可以同时使用这两者:

1 class MyClass : Interface1, Interface2 {
2     fun myFunction() {
3         function1()
4         function2()
5     }
6 }

非常棒!在组织我们的代码时,这给我们提供了更多的多功能性。

接口不能保持状态

请记住这个很重要的限制。我们能够在接口中添加代码,却不能有状态

这就是说我们不能在接口中创建属性,用来存储状态。如果我们在接口中定义了属性,实现这个接口的类就需要重写这个接口。

让我们来看一个例子。假设接口需要一个上下文:

1 interface Toaster {
2     val context: Context
3
4     fun toast(message: String) {
5         Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
6     }
7 }

这段代码比较简单。这是一个实现显示Toast方法的接口。它要求上下文来做到这点。

如果我们有一个activity要用这个接口,它就需要重写这个上下文:

1 class MyActivity : AppCompatActivity(), Toaster {
2     override val context = this
3
4     override fun onCreate(savedInstanceState: Bundle?) {
5         super.onCreate(savedInstanceState)
6         toast("onCreate")
7     }
8 }

我们将Activity本身指定为上下文,接口使用它。就这么简单。

现在,你就可以在Activity中使用Toaster函数,且无任何问题。

接口委托

Kotlin另一个非常有趣的特性是接口委托。它是一个非常强大的工具用来实现更清洁的组合。

假设,你有一个类C,由A和B两个类的对象组成:

 1 interface A {
 2     fun functionA(){}
 3 }
 4
 5 interface B {
 6     fun functionB(){}
 7 }
 8
 9 class C(val a: A, val b: B) {
10     fun functionC(){
11         a.functionA()
12         b.functionB()
13     }
14 }

类C在自己的代码中使用函数A和B。

如果对象是由其它组件组合而成的,它能够很好直接使用那些组件的函数。

这段代码还有另一种写法,可以得到相同的结果,就是用接口委托:

1 class C(a: A, b: B): A by a, B by b {
2     fun functionC(){
3         functionA()
4         functionB()
5     }
6 }

你能够看到类C实现了A和B,但是,它实际上是委托实现给对象,以参数方式接收。

通过用接口委托,该类可以直接使用来自实现类的函数,并且仍然将该实现委托给其他对象

结论

我们已经看到Java接口与Kotlin的之间的差异。现在尝试找出在什么情况下可以简化我们的生活,因为新的想法能够开辟一个可能的新天地。

这样你的代码将比以前更可重用,更易读了。

还不相信Kotlin可用于Android开发吗?尽快开始吧!幸亏有前面一系列文章,你可以学习到更多的Kotlin知识,或者在本书中学习从零开始创建一个完整的应用程序。

时间: 2024-08-28 00:04:33

谁说接口不能有代码?—— Kotlin接口简介(KAD 26)的相关文章

服务器响应的生成:HTTP状态代码——HttpServletResponse接口应用

一 HTTP响应的格式              web服务器对客户端的响应一般包含:一个状态行,一些响应报头,一个空行和相应的文档构成.               1,状态行: 状态行由HTTP版本,一个状态代码以及一段对应状态代码的简短消息组成,表示请求是否被理解或被满足.HTTP版本由服务器决定.状态码一般由系统自动设置为200.也可以用Servlet设置状态码.消息巍峨自定义. 2,响应报. 3,空行 4,文档 二 如何设置状态代码 在向客户程序发送任何文档内容之前调用方法设置状态代码

Retrofit 2.0 接口API服务代码

接口API服务代码 接口定义有以下的配置方式, 取决于接口的参数需求(使用注解方式标注请求模板接口) // 可以直接在URL中指定参数 @GET("version/android/2.3.0?order=desc") Call<VersionInfoDTO> loadVersionInfo(); // 设置POST请求体 @POST("users/new") void createUser(@Body User user, Callback<Use

C#与Java对比学习:类型判断、类与接口继承、代码规范与编码习惯、常量定义(转载)

C#与Java对比学习:类型判断.类与接口继承.代码规范与编码习惯.常量定义 类型判断符号: C#:object a;  if(a is int) { }  用 is 符号判断 Java:object a; if(a instanceof Integer) { } 用 instanceof 符号判断 类与接口的继承: C#:public class MDataRow : List<MDataCell>, IDataRecord, ICustomTypeDescriptor Java:publi

thinkphp框架对接支付宝即时到账接口回调的代码

关于支付宝即时收款接口的对接过程,很简单,也有很多人发过,我这里就不在啰嗦了,对接完成后,在线支付成功后的回调,相对来说,是个难点,,我重点分享下我的经验. 我在开发二代旅游CMS(http://www.erdaicms.com)的时候,在回调的时候,也花了不少时间. 不管是支付宝接口好是微信支付接口,回调都分为跳转回调和异步通知回调,跳转回调是不保险的,加入客人支付完成后马上把支付页面关闭,没跳转,就通知不到你这个订单已经支付了,所以我们要用异步通知回调: $alipay_config['no

利用AOP实现空模式的无缝使用 创世纪代码应用之一:一行代码让接口框架RUN起来

这是我开播第一篇,朋友们多多支持.捧场,谢谢. 引子 地是空虚混沌.渊面黑暗. 神的灵运行在水面上.  神说.要有光.就有了光.  神看光是好的.就把光暗分开了.  神称光为昼.称暗为夜.有晚上.有早晨.这是头一日. ——引至<圣经.神创造天地> 关键词:null,AOP,Spring.Net框架,空模式,面向接口编程,单元测试,方法拦截器 摘要:在我们编程的时候很难离开null,它给我们带来了很多麻烦.本文从新的视角利用AOP无缝使用空模式部分解决了这个问题,最重要的是可以使得我们的程序尽早

native关键字初识--java调用非java代码的接口

Java基础知识--JNI入门介绍(上) Java? 本机接口(Java Native Interface,JNI)是一个标准的 Java API,它支持将 Java 代码与使用其他编程语言编写的代码相集成.如果您希望利用已有的代码资源,那么可以使用 JNI 作为您工具包中的关键组件 -- 比如在面向服务架构(SOA)和基于云的系统中.但是,如果在使用时未注意某些事项,则 JNI 会迅速导致应用程序性能低下且不稳定. JNI 的发展JNI 自从 JDK 1.1 发行版以来一直是 Java 平台的

Python Api接口自动化测试框架 代码写用例

公司新来两个妹子一直吐槽这个接口测试用例用excel维护起来十分费脑费事,而且比较low(内心十分赞同但是不能推翻自己),妹子说excel本来就很麻烦的工具,于是偷偷的进行了二次改版. 变更内容如下: 1.代码结构 image.png 2.新增测试报告网页版和版本管理 3.新增用例代码化 一.封装一个获取用例的模块 image.png 用例的写法可以按照yml文件的写法,后缀的文件都可为.conf..config..ini.[]中的是测试用例场景,下面的参数内容对应接口用例参数. 简单介绍下py

Kotlin接口

来源于菜鸟教程 Kotlin接口与Java8类似,使用interface关键字定义接口.允许方法有默认实现: interface MyInterface { fun bar() //未实现 fun foo(){ //已实现 println("foo") } } 实现接口 一个类或者对象可以实现一个或多个接口. class Child : MyInterface { override fun bar (){ //方法体 } } 实例: 接口中的属性 接口中的属性只能是抽象的,不允许初始化

继承-代码块-接口

代码块 分类:根据其位置和声明的不同: 局部代码块,构造(初始化)代码块,静态代码块,同步代码块(多线程) 加载顺序老大: 静态代码块:类中方法外 用来给类做初始化,加载的时候,只执行一次(.class) 应用场景:通常用于驱动,配置文件的加载 加载顺序老二: 构造代码块(初始化块):在类中方法外 多个构造方法中出现相同的代码,可以考虑放入其中,因为构造代码块优先执行于构造方法,每创建一次对象就执行一次 加载顺序老三:(随着调用而进栈) 局部代码块: 在方法中出现;限定生命周期,及早释放内存,提