一、接口
1.1、抽象方法与默认方法
Kotlin 中的接口与 Java 8 中的类似,可以包含抽象方法的定义以及非抽象方法的实现,不需要使用 default 关键字来标注有默认实现的非抽象方法,但在实现接口的抽象方法时需要使用 override 进行标注
fun main(args: Array<String>) {
val view = View()
view.click()
view.longClick()
}
class View : Clickable {
override fun click() {
println("clicked")
}
}
interface Clickable {
fun click()
fun longClick() = println("longClicked")
}
如果一个类实现了多个接口,而接口包含带有默认实现且签名相同的方法,此时编译器就会要求开发者必须显式地实现该方法,可以选择在该方法中调用不同接口的相应实现
class View : Clickable, Clickable2 {
override fun click() {
println("clicked")
}
override fun longClick() {
super<Clickable>.longClick()
super<Clickable2>.longClick()
}
}
interface Clickable {
fun click()
fun longClick() = println("longClicked")
}
interface Clickable2 {
fun click()
fun longClick() = println("longClicked2")
}
1.2、抽象属性
接口中可以包含抽象属性声明,接口不定义该抽象属性是应该存储到一个支持字段还是通过 getter 来获取,接口本身并不包含任何状态,因此只有实现这个接口的类在需要的情况下会存储这个值
看以下例子,Button 类和 TextView 类都实现了 Clickable 接口,并都提供了取得 statusValue 值的方式
Button 类提供了一个自定义的 getter 用于在每次访问时重新获取 statusValue 值,因此在多次获取属性值时其值可能都会不一致,因为每次 getRandom() 方法都会被调用
TextView 类中的 statusValue 属性有一个支持字段来存储在类初始化时得到的数据,因此其值在初始化后是不会再次获取值,即 TextView 类中的 getRandom() 只会被调用一次
fun main(args: Array<String>) {
val button = Button()
println(button.statusValue)
val textView = TextView()
println(textView.statusValue)
}
class Button : Clickable {
override val statusValue: Int
get() = getRandom()
private fun getRandom() = Random().nextInt(10)
}
class TextView : Clickable {
override val statusValue: Int = getRandom()
private fun getRandom() = Random().nextInt(10)
}
interface Clickable {
val statusValue: Int
}
除了可以声明抽象属性外,接口还可以包含具有 getter 和 setter 的属性,只要它们没有引用一个支持字段(支持字段需要在接口中存储状态,而这是不允许的)
interface Clickable {
val statusValue: Int
val check: Boolean
get() = statusValue > 10
}