前言
Kotlin的繼承基本上跟java的類似。
Kotlin強化了接口實現接口的邏輯。可以更清晰的呈現 每個接口類的描述。
除了文字版本,也有Xmind版本 github地址
定義
使用 interface 定義
範例
interface MyInterface {
fun bar() // 未實現
fun foo() { //已實現
// 可選的方法體
println("foo")
}
}
接口中的屬性
只能是抽象的,不允許初始化值。
在接口中聲明的屬性
- 要麼是抽象的
- 要麼提供訪問器的實現
在接口中聲明的屬性不能有幕後字段(backing field)
實現接口時,必須重寫屬性。
範例
interface MyInterface {
val prop: Int // 抽象的
val propertyWithImplementation: String
get() = "foo"
fun foo() {
print(prop)
}
}
class Child : MyInterface {
override val prop: Int = 29
}
與java不同
- java中可以定義 變量
- 被繼承後,可以 使用這些變量
接口實現
與java一樣,在Kotlin中,類也可以實現多個interface
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()
}
override fun bar() {
super<B>.bar()
}
}
在Kotlin中,重寫必須要標明override。其實,在java也需要標記。這是早些年,不標記override也不報錯。
接口繼承
在Kotlin中,接口可以實現接口。
- 既提供基類型成員的實現
- 也聲明新的函數與屬性
範例
interface Named {
val name: String
}
interface Person : Named {
val firstName: String
val lastName: String
override val name: String get() = "$firstName $lastName"
}
data class Employee(
// 不必實現“name”
override val firstName: String,
override val lastName: String,
val position: Position
) : Person
解決覆蓋衝突
實現多個接口時,可能會遇到同一方法繼承多個實現的問題.
這裏從簡說。在之前的文章中有提及
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() ///注意看這裏
}
override fun bar() {
super<B>.bar() ///注意看這裏
}
}
遇到同一方法,繼承多個實現,那就需要明確標明!
小結
Kotlin接口繼承的做法,強調了,實現接口的子類需要了解的東西。而被實現的接口的父類部分則隱藏了。
Kotlin解決了實現多個接口時,繼承多個同名實現的問題。