Kotlin学习之-5.3 接口

Kotlin学习之-5.3 接口

Kotlin中的接口和Java 8中的接口很接近。它们可以定义抽象函数,也可以实现。和抽象类的区别在于接口不能存储状态。接口可以拥有属性,但是这些属性必须是抽象的或者提供访问方法的实现。

接口使用关键字interface 来定义

interface MyInterface {
    fun bar() 
    fun foo() {
        // 可选的函数主体
    }
}

实现接口

一个类或者一个对象可以实现一个或者多个接口

class Child: MyInterface {
    override fun bar() {
        // ...
    }
}

接口中的属性

可以在接口中定义属性。在接口中定义属性既可以是抽象的,也可以提供访问方法的实现。定义在接口中的属性不能有backing field,并且在接口中定义的访问方法也不能引用他们。

interface MyInterface {
    val prop: Int // 抽象的

    val propertyWithImplementation: String
        get() = "foo"

    fun foo() {
        print(prop)
    }
}

class Child : MyInterface {
    override val prop: Int = 29
}

解决复写冲突

当我们在父类列表中定义多个类型时,很有可能会继承一个方法超过一个的实现。 例如

interface A {
    fun foo() { print("A") }
    fun bar()
}

interface B {
    fun foo() { print("B") }
    fun bar() { print("bar") }
}

class C : A {
    override fun bar() { print("bar") }
}

class D : A, B {
    override fun foo() {
        super<A>.foo()
        super<B>.foo()
    }

    override fun bar() {
        super<B>.bar()
    }
}

接口A和B都定义了foo()bar() 函数。它们俩都实现了foo(),但是只有B实现了bar(), 在A中bar()没有被描述成抽象的,因为当函数没有主体时,这是接口的默认写法。 现在如果我们继承A来写一个实体类C,必须复写bar()函数并提供它的实现。

然而,如果继承A 和B 来写类D,我们需要实现所有从接口中重复继承的方法,并且写明D 是如何实现他们的。这条规则既适用单继承的方法,也适用于多继承的方法。


PS,我会坚持把这个系列写完,有问题可以留言交流,也关注专栏Kotlin for Android Kotlin安卓开发

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章