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