前言
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解决了实现多个接口时,继承多个同名实现的问题。