說明
Kotlin中的接口與Java8非常相似。他們可以包含抽象方法的聲明,以及方法實現。與抽象類不同,接口不能存在存儲狀態。他們可以具有屬性,但這些屬性必須是抽象的,或者提供存儲器實現。
舉例
定義接口
接口聲明
與Java類似,在kotlin中使用關鍵字interface聲明接口
interface MyInterface
{
fun bar()// 未實現
fun foo()
{? //已實現
// 可選的方法體
println("foo")
}
}
實現接口
一個類或者對象可以實現一個或多個接口,類和接口之間使用運算符":"標注。
class Child : MyInterface
{
override fun bar()
{
// 方法體
}
}
示例
interface MyInterface
{
fun bar()
fun foo()
{
// 可選的方法體
println("foo")
}
}
class Child : MyInterface
{
override fun bar()
{
// 方法體
println("bar")
}
}
fun main(args: Array)
{
val c =? Child()
c.foo();
c.bar();
}
輸出結果:
foo
bar
接口中的屬性
接口中的屬性只能是抽象的,不允許初始化值,接口不會保存屬性值,實現接口時,必須重寫屬性。
接口中的屬性
interface MyInterface
{
var name:String //name 屬性, 抽象的
}
創建類實例重寫接口屬性
class MyImpl:MyInterface
{
override var name: String = "runoob" //重載屬性
}
實例分析
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)
{
val c =? Child()
c.foo();
c.bar();
println(c.name)
}
輸出結果:
foo
bar
runoob
函數重寫
實現多個接口時,可能會遇到同一個方法繼承多個實現的問題。
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.foo()
super.foo()
}
override fun bar()
{
super.bar()
}
}
fun main(args: Array)
{
val d =? D()
d.foo();
d.bar();
}
輸出結果: ABbar
實例中接口 A 和 B 都定義了方法 foo() 和 bar(), 兩者都實現了 foo(), B 實現了 bar()。因為 C 是一個實現了 A 的具體類,所以必須要重寫 bar() 并實現這個抽象方法。
然而,如果我們從 A 和 B 派生 D,我們需要實現多個接口繼承的所有方法,并指明 D 應該如何實現它們。這一規則 既適用于繼承單個實現(bar())的方法也適用于繼承多個實現(foo())的方法。
參考: