20171010_Kotlin_interface

2017-10-10  本文已影响0人  mingmingz

发现自己对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")
    }
}

上一篇下一篇

猜你喜欢

热点阅读