美文网首页kotlin程序员Kotlin编程
Kotlin面向对象之接口(Interfaces)

Kotlin面向对象之接口(Interfaces)

作者: 已迁至知乎_此不再维护 | 来源:发表于2017-05-22 15:51 被阅读26次

    Kotlin中的接口非常类似于Java 8。它们可以包含抽象方法,以及抽象方法的实现。它们与抽象类不同之处在于接口不能存储状态。 它们可以具有属性,但是需要被声明为抽象的,或提供访问器的实现。

    接口的定义需要使用interface关键字:

    interface MyInterface {
        fun bar()
        fun foo() {
          // optional body
        }
    }
    

    接口的实现(Implementing Interfaces)

    一个类或对象可以实现一个或多个接口:
    
    class Child : MyInterface {
        override fun bar() {
            // body
        }
    }
    

    接口中的属性(Properties in Interfaces)

    可以在接口中声明属性。在接口中声明的属性可以是抽象的,也可以为访问器提供实现。 在接口中声明的属性不能具有后备字段,因此在接口中声明的访问器不能引用后备字段:

    interface MyInterface {
        val prop: Int // abstract
    
        val propertyWithImplementation: String
            get() = "foo"
    
        fun foo() {
            print(prop)
        }
    }
    
    class Child : MyInterface {
        override val prop: Int = 29
    }
    

    重载冲突的解决(Resolving overriding conflicts)

    当我们的基类列表(要继承或实现的)存在多个基类(父类或接口)的时候,可能会出现我们继承同一方法的多个实现的情况。 例如:

    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()(bar()在A中没有标记为abstract,但接口中的方法如果没有方法体的话默认是abstract的)。现在,如果我们从A导出一个具体的类C,我们显然必须重写bar()并提供一个实现。

    然而,如果我们从A和B导出D,我们需要实现我们从多个接口继承的所有方法,并指定D应该如何实现它们。此规则适用于继承单个实现(bar())和多个实现(foo())的方法。

    相关文章

      网友评论

        本文标题:Kotlin面向对象之接口(Interfaces)

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