Edit Page

接口

Kotlin 的接口与 Java 8 类似,既包含抽象方法的声明,也包含 实现。与抽象类不同的是,接口无法保存状态。它可以有 属性但必须声明为 abstract或提供访问器实现。

使用关键字 interface 来定义接口。

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

实现接口

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

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

接口属性

你可以在接口定义属性。在接口中声明的属性要么是抽象的,要么提供访问器的实现。在接口中声明的属性不能有后备字段,因此访问器不能引用他们。

interface MyInterface {
    val property: Int // abstract

    val propertyWithImplementation: String
        get() = "foo"

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