-
Kotlin
的接口与Java
的接口类似,可以声明抽象方法,但是Kotlin
不同的是,它还可以包含实现(Java中的接口不能有方法实现)。 -
与抽象类不同的是,接口无法保存状态。
-
Kotlin
的接口可以有属性但必须声明为抽象或提供访问器实现。 -
Kotlin
可以在接口中定义属性。在接口中声明的属性要么是抽象的,要么提供访问器的实现。在接口中声明的属性不能有幕后字段(backing field
),因此接口中声明的访问器不能声明的属性。 -
Kotlin
中定义的属性不允许有初始化器,实现接口的类必须重写接口中定义的属性(重写可以在主构造函数中进行)。
interface Action {
var date: String // 抽象的属性
val desc: String // 带有访问器的属性
get() = "action"
// 可以声明抽象方法
fun move()
fun teach() {
// 可以有方法的实现
}
}
class Teacher : Person, Action {
// 必须重写接口中定义的属性
override var date: String
get() = field
set(value) {
field = value
}
// age属性未定义初始化器
var age: Int = 0
get() = field
set(value) {
field = value
}
var _addr: String? = null // 幕后属性
val addr: String
override fun move() {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
get() {
if(null == _addr) {
_addr = "this is test backing property"
}
return _addr ?: throw AssertionError("Set to null by another thread")
}
init {
// 在初始化块中初始化
age = 0
date = System.currentTimeMillis().toString()
}
constructor(name: String) : super(name) {
// 在构造函数中初始化
age = 0
date = System.currentTimeMillis().toString()
}
}
Kotlin
中的接口也是可以继承的,从而既提供基类型成员的实现也声明新的函数与属性。
interface StudentAction: Action {
fun study()
}
Kotlin
中的接口是可以包含实现的,如果在两个接口中都有同签名的方法实现,而恰好有一个类同时这两个接口,想要正确调用相应接口的方法实现,可以使用supper<接口名>.方法名
实现正确的调用,解决覆盖冲突。
interface IA {
fun print() {
println("This is from A")
}
}
interface IB {
fun print() {
println("This is form B")
}
}
class C: IA, IB {
override fun print() {
// 调用IA接口中的print方法
super<IA>.print()
// 调用IB接口中的print方法
super<IB>.print()
}
}