美文网首页
20171010_Kotlin_interface

20171010_Kotlin_interface

作者: mingmingz | 来源:发表于2017-10-10 15:27 被阅读0次

    发现自己对Kotlin的Interface知识掌握的只是"可以实现它"以及和Java类似的知识点,跟着SOF的KotlinTopics再复习一遍,所以本篇内容基本就是把 这里 的内容翻译一部分自己试过的内容

    Interface with default implementations

    Kotlin的interface中的方法可以有默认实现,即实现了这个接口的派生类可以不实现这个接口方法直接调用:

    interface MyInterface1{
        fun withImplementation(){
            println("withImplementation() 被调用了")
        }
    }
    
    class MyClass :MyInterface1
    
    fun main(args: Array<String>) {
        MyClass().withImplementation()//编译无报错,运行后控制台输出inteface默认实现方法中的字符串
    }
    
    

    Properties

    我们可以在interface定义properties .但是interface不能有状态,我们可以将property定义为abstract或者为其提供默认实现的accessors

    interface MyInterface {
        val property: Int // abstract
    
        val propertyWithImplementation: String
            get() = "foo"//provide accessors
    
        fun foo() {
            print(property)
        }
    }
    
    class Child : MyInterface {
        //由于是接口的抽象property,在派生类需要实现
        override val property: Int = 3
    }
    

    默认实现也对参数的getter,setter生效:

    interface MyInterface2 {
        val helloWorld
            get() = "Hello World!"
    }
    
    //接口访问器实现不能使用backing field
    interface MyInterface3 {
        // 这个属性不能被编译通过
        var helloWorld: Int
            get() = field
            set(value) { field = value }
    }
    

    这一段说interface的参数可以有getter和setter没太明白,因为如果是常量val,那可以有getter,但想有变量var却会编译错误,那setter就无法使用,还有待学习

    Multiple implementations

    interface A {
        fun notImplemented()
        fun implementedOnlyInA() { print("only A") }
        fun implementedInBoth() { print("both, A") }
        fun implementedInOne() { print("implemented in A") }
    }
    
    interface B {
        fun implementedInBoth() { print("both, B") }
        fun implementedInOne() // only defined
    }
    
    class MyClass2 : A, B {
        // 接口声明的方法,没有默认实现需要派生类来完成实现
        override fun notImplemented() { print("Normal implementation") }
    
        // implementedOnlyInA()有默认实现,派生类可以不重复实现
    
        // 当我们实现多个有默认实现同名方法的接口时,编译器会疑惑它该使用哪个默认实现,这时我们需要实现这个方法提供自己的实现,我们也可以选择声明使用接口的默认实现
        override fun implementedInBoth() {
            super<B>.implementedInBoth()
            super<A>.implementedInBoth()
          //or do your things
        }
    
        //一个接口已有该方法的默认实现,我们也可以继续去定义别的方法实现
        override fun implementedInOne() {
            super<A>.implementedInOne()
            print("implementedInOne class implementation")
        }
    }
    
    

    相关文章

      网友评论

          本文标题:20171010_Kotlin_interface

          本文链接:https://www.haomeiwen.com/subject/wgnvyxtx.html