zoukankan      html  css  js  c++  java
  • 谁说接口不能有代码?—— 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,由AB两个类的对象组成:

     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实现了AB,但是,它实际上是委托实现给对象,以参数方式接收。

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

     

    结论

     

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

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

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

  • 相关阅读:
    MVC部署到IIS 出现未能加载文件或程序集“System.Web.Http.WebHost.....
    web在线聊天框滚动条自动在底部
    IE 浏览器下英文 微软雅黑 不起作用
    U3D MonoBehaviour.InvokeRepeating 和 MonoBehaviour.Invoke
    U3D 中关于相同的怪物不发生碰撞 或者是想让一些物体发生碰撞 又不想让一些物体发生碰撞
    U3D 2D中给精灵添加刚体后 发现精灵会倒 ..
    Axure教程 | 轻量级的后台原型框架
    Axure:侧导航收缩与展开
    SQLSERVER数据库调优
    MySQL用GROUP BY分组取字段最大值或最新一条
  • 原文地址:https://www.cnblogs.com/figozhg/p/6979138.html
Copyright © 2011-2022 走看看