Kotlin 接口與 Java 8 類似,使用 interface 關(guān)鍵字定義接口,允許方法有默認(rèn)實(shí)現(xiàn):
interface MyInterface {
fun bar() // 未實(shí)現(xiàn)
fun foo() { //已實(shí)現(xiàn)
// 可選的方法體
println("foo")
}
}
實(shí)現(xiàn)接口
一個類或者對象可以實(shí)現(xiàn)一個或多個接口。
class Child : MyInterface {
override fun bar() {
// 方法體
}
}
實(shí)例
interface MyInterface {
fun bar()
fun foo() {
// 可選的方法體
println("foo")
}
}
class Child : MyInterface {
override fun bar() {
// 方法體
println("bar")
}
}
fun main(args: Array<String>) {
val c = Child()
c.foo();
c.bar();
}
輸出結(jié)果為:
foo
bar
接口中的屬性
接口中的屬性只能是抽象的,不允許初始化值,接口不會保存屬性值,實(shí)現(xiàn)接口時,必須重寫屬性:
interface MyInterface{
var name:String //name 屬性, 抽象的
}
class MyImpl:MyInterface{
override var name: String = "runoob" //重寫屬性
}
實(shí)例
interface MyInterface {
var name:String //name 屬性, 抽象的
fun bar()
fun foo() {
// 可選的方法體
println("foo")
}
}
class Child : MyInterface {
override var name: String = "runoob" //重寫屬性
override fun bar() {
// 方法體
println("bar")
}
}
fun main(args: Array<String>) {
val c = Child()
c.foo();
c.bar();
println(c.name)
}
輸出結(jié)果為:
foo
bar
runoob
函數(shù)重寫
實(shí)現(xiàn)多個接口時,可能會遇到同一方法繼承多個實(shí)現(xiàn)的問題。例如:
實(shí)例
interface A {
fun foo() { print("A") } // 已實(shí)現(xiàn)
fun bar() // 未實(shí)現(xiàn),沒有方法體,是抽象的
}
interface B {
fun foo() { print("B") } // 已實(shí)現(xiàn)
fun bar() { print("bar") } // 已實(shí)現(xiàn)
}
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()
}
}
fun main(args: Array<String>) {
val d = D()
d.foo();
d.bar();
}
輸出結(jié)果為:
ABbar
實(shí)例中接口 A 和 B 都定義了方法 foo() 和 bar(), 兩者都實(shí)現(xiàn)了 foo(), B 實(shí)現(xiàn)了 bar()。因?yàn)?C 是一個實(shí)現(xiàn)了 A 的具體類,所以必須要重寫 bar() 并實(shí)現(xiàn)這個抽象方法。
然而,如果我們從 A 和 B 派生 D,我們需要實(shí)現(xiàn)多個接口繼承的所有方法,并指明 D 應(yīng)該如何實(shí)現(xiàn)它們。這一規(guī)則 既適用于繼承單個實(shí)現(xiàn)(bar())的方法也適用于繼承多個實(shí)現(xiàn)(foo())的方法。