Extension
Extension 是 Kotlin 中一个非常强大的功能,主要用于对已经定义好的类的行为或者属性进行扩展,这一特性非常类似 Javascript 中的 Prototype。
扩展类的行为
先定义一个需要被扩展的类
class Num(var x: Int) {
fun add(y: Int) {
x += y
}
}
以上定义一个 Num
,该类包含一个方法 add()
,用于将内置的变量与一个参数进行相加。
接下来扩展该类,为其添加一个将内置变量与两个参数进行相加的方法,语法为 类.方法(){}
fun Num.add(a: Int, b: Int) {
this.x += a + b
}
接着就可以正常进行调用了
var n: Num = Num(10)
n.add(4)
n.add(1, 3)
println(n.x) // 18
扩展功能不仅可以用于自定义的类,也可以用于内置的类。但是需要注意如果添加的扩展的方法与类中已存在的方法同名时,则该类的实例调用的始终是类中已定义的方法,而不会调用扩展的方法。
例
class Num(var x: Int) {
fun foo() {
println("foo in Num")
}
}
fun Num.foo() {
println("foo in extension")
}
n.foo() // foo in Num
扩展类的属性
扩展类的属性用法基本同扩展类的行为。以下展示为内置类 List 添加一个能够直接访问其第二个元素的新的属性
val <T> List<T>.second: T
get() = get(1)
调用该属性
val l: List<Int> = listOf(1, 2, 3)
println(l.second) // 2
扩展伴生对象
扩展伴生对象时使用方式略微不同,需要添加中间类 Companion
定义一个包含伴生对象的类
class MyClass {
companion object {}
}
扩展其伴生对象
fun MyClass.Companion.foo() {
println("foo in companion object")
}
调用扩展的方法
MyClass.foo()
总结
- Kotlin 中可以扩展已经定义的类的行为和属性。
- 扩展的行为或属性如果与类中已定义的成员同名则会被忽略。
项目源码见 JGSK/k02_extension