type: doc layout: reference category: "Syntax"

title: "Interfaces"

接口

Kotlin 的接口与 Java 8 类似,既包含抽象方法的声明,也包含实现。与抽象类不同的是,接口无法保存状态。它的的属性必须声明为 abstract。

使用关键字 interface{: .keyword } 来定义接口。

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

实现接口

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

class Child : MyInterface {
   fun bar() {
      // body
   }
}

接口属性

接口只能定义无状态(stateless)的属性。

interface MyInterface {
    val property: Int // abstract

    fun foo() {
        print(property)
    }
}

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

解决重写(Override)冲突

实现多个接口时,可能会遇到接口方法名同名的问题。

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()
  }
}

上例中,接口 AB 都定义了方法 foo()bar()。 两者都实现了 foo(), 但是只有 B 实现了 bar() (bar()A 中没有标记为 abstract,因为没有方法体时默认为 abstract)。因为 C 是一个实现了 A 的具体类,所以必须要重写 bar() 并实现这个抽象方法。D 可以不用重写 bar(),因为它实现了 AB,因而可以自动继承 Bbar() 的实现,但是两个接口都定义了方法 foo(),为了告诉编译器 D 会继承谁的方法,必须在 D 中重写 foo()