作者:Antonio Leiva

时间:Jun 6, 2017

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

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

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

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

Java 6的接口

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

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

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

Kotlin的接口

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

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

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

 interface Interface1 {
fun function1() {
Log.d("Interface1", "function1 called")
}
}

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

 interface Interface2 {
fun function2() {
Log.d("Interface2", "function2 called")
}
}

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

 class MyClass : Interface1, Interface2 {
fun myFunction() {
function1()
function2()
}
}

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

接口不能保持状态

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

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

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

 interface Toaster {
val context: Context fun toast(message: String) {
Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
}
}

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

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

 class MyActivity : AppCompatActivity(), Toaster {
override val context = this override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
toast("onCreate")
}
}

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

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

接口委托

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

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

 interface A {
fun functionA(){}
} interface B {
fun functionB(){}
} class C(val a: A, val b: B) {
fun functionC(){
a.functionA()
b.functionB()
}
}

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

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

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

 class C(a: A, b: B): A by a, B by b {
fun functionC(){
functionA()
functionB()
}
}

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

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

结论

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

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

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

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

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

    类型判断符号: C#:object a;  if(a is int) { }  用 is 符号判断 Java:object a; if(a instanceof Integer) { } 用 inst ...

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

    关于支付宝即时收款接口的对接过程,很简单,也有很多人发过,我这里就不在啰嗦了,对接完成后,在线支付成功后的回调,相对来说,是个难点,,我重点分享下我的经验. 我在开发二代旅游CMS(http://ww ...

  3. <<海闻电子发票接口 ESB 封装 代码指示 文档>>

    <<海闻电子发票接口 ESB 封装 代码指示 文档>> isValid 是否有效标志 代码 中文 说明 true 成功 false 失败   code 海闻错误说明 代码 中文 ...

  4. [改善Java代码]在接口中不要存在实现代码

    第3章  类.对象及方法 书读得多而不思考,你会觉得自己知道的很多. 书读得多而思考,你会觉得自己不懂的越来越多. —伏尔泰 在面向对象编程(Object-Oriented Programming,O ...

  5. Kotlin 接口

    Kotlin 接口与 Java 8 类似,使用 interface 关键字定义接口,允许方法有默认实现: interface MyInterface { fun bar() // 未实现 fun fo ...

  6. 基于Axis1.4的webservice接口开发(代码开发)

    基于Axis1.4的webservice接口开发(代码开发) 一.开发环境: 我的开发环境是MyEclipse 2015+Apache-Tomcat-8.0.21. 二.代码开发: 1.新建一个Web ...

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

    公司新来两个妹子一直吐槽这个接口测试用例用excel维护起来十分费脑费事,而且比较low(内心十分赞同但是不能推翻自己),妹子说excel本来就很麻烦的工具,于是偷偷的进行了二次改版. 变更内容如下: ...

  8. Java基础进阶:多态与接口重点摘要,类和接口,接口特点,接口详解,多态详解,多态中的成员访问特点,多态的好处和弊端,多态的转型,多态存在的问题,附重难点,代码实现源码,课堂笔记,课后扩展及答案

    多态与接口重点摘要 接口特点: 接口用interface修饰 interface 接口名{} 类实现接口用implements表示 class 类名 implements接口名{} 接口不能实例化,可 ...

  9. 接口测试-Java代码实现接口请求并封装

    前言:在接口测试和Java开发中对接口请求方法进行封装都非常有必要,无论是在我们接口测试的时候还是在开发自测,以及调用某些第三方接口时,都能为我们调用和调试接口提供便捷: Java实现对http请求的 ...

随机推荐

  1. 生成并部署SSH key

    1.如何生成ssh公钥 你可以按如下命令来生成 sshkey: ssh-keygen -t rsa -C "xxxxx@xxxxx.com" # Generating public ...

  2. [转]基于WorldWind平台的建筑信息模型在GIS中的应用

    1 引言   随着BIM(Building Information Modeling)的不断发展,建筑信息建模的理念贯穿着建筑.结构.施工.运行维护以及拆迁再规划的整个建筑的生命周期,这种理念不仅使得 ...

  3. java使用类序列化反序列化(读写文件)

    创建类:Role package com.wbg.springRedis.entity; import java.io.Serializable; public class Role implemen ...

  4. Poj2010 Moo University - Financial Aid

    题意的话,就看其他人的吧 概括:二分中位数 大体上便是二分一个中位数,带入检验,若分数比他小的有\(\lfloor n/2 \rfloor\)个,分数比他的大的也有这么多,而且贪心的买,花费小于预算. ...

  5. HDU 1045 Fire Net(DFS 与8皇后问题类似)

    Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  6. 上传组件uploadify在spring中返回406 / Not Acceptable 问题解决

    这个问题在chrome中正常.在火狐和ie中就会报这个错误. 原因就是chrome的accept是*/* 火狐和ie的accept是text/* 但是spring的accept清单中是没有text/* ...

  7. 使用canvas输出base64_url

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 用Jquery控制元素的上下移动 实现排序功能

    在页面上,控制元素上下移动,进行排序是我们比较常用的功能,今天我用jQuery 写个 简单方便,功能齐全的实现方式. 话不多说,直接上代码,下面是基础的引入jq和html元素部分: <scrip ...

  9. 高性能MySQL--innodb中事务的隔离级别与锁的关系

    最近买了<高性能MySQL>这本书回来看,从中收益颇多!我来一吐为快! 我们都知道事务,那么在什么情况下我们需要使用事务呢? 银行应用是解释事务的一个经典例子.假设一个银行的数据库有两张表 ...

  10. windows10下“sqlplus / as sysdba”执行提示无权限解决办法

    ORA_DBA:是ORACLE 的特有用户,是超级管理员权限,建成DBA 它具有管理数据库的最高权限. 注明:需要以管理员身份运行cmd,不然第4步会失败(点开始,输入cmd,右键以管理员身份运行) ...