Kotlin能够扩展一个类的新功能而无需继承该类或使用像装饰者这样的任何类型的设计模式。这通过叫做扩展的特殊声明完成。Kotlin支持持 扩展函数 与 扩展属性。
- 扩展函数
基本写法:
class A{
var message = "A"
}
fun A.toS(){
println("toS : ${this.message}")
}
fun main() {
val a = A()
a.toS()
}
输出结果:
toS : A
以上代码对A声明了一个扩展函数。扩展并不能真正的修改他们所扩展的类,通过定义一个扩展,你并没有在类中插入新成员,仅仅是可以通过该类型的变量用点表达式去调用这个新函数。调用的扩展函数是由函数调用所在的表达式的类型来决定的,而不是由表达式运行时求值结果决定的。例如:
open class A
class B : A()
fun A.toS(){
println("toS : A")
}
fun B.toS(){
println("toS : B")
}
fun print(a : A){
a.toS()
}
fun main() {
print(B())
}
输出结果
toS : A
这个例子说明调用的扩展函数只取决于参数 a 的声明类型,该类型是 A 类。如果一个类定义的成员函数与一个扩展函数相同,都适用给定的参数,这种情况总是取成员函数。例如:
class A{
fun toShow(){
println("in A")
}
}
fun A.toShow(){
println("in : Extention")
}
fun main() {
A().toShow()
}
输出结果
in A
注意可以为可空的接收者类型定义扩展。例如:
class A{
val message = "A"
fun toShow(){
println("in A")
}
}
fun A?.toShow(){
if (this == null){
println("null")
}else{
// 空检测之后,“this”会自动转换为非空类型
println("in : ${this.message}")
}
}
fun main() {
A().toShow()
}
- 扩展属性
基本写法
class A{
var message = "A"
fun toShow(){
println("in A : $message")
}
}
var A.code : String
get() {return "code"}
set(value) {
//set方法并没有field可以用来存储value
this.message = value
}
fun main() {
val a = A()
a.code = "B"
a.toShow()
println(a.code)
}
输出结果
in A : B
code
扩展属性不能有初始化器
···
var A.code : String = “B" // 这样是错误的
···
网友评论