扩展方法 extension function
1.定义&使用
class Teather {
var name: String = ""
var age: Int = 0;
}
fun Teather.print() {
println("My name=$name and I am $age years old.")
}
var t=Teather()
t.print()//和成员函数是很类似的
2.静态的
扩展方法是静态的,只对直接指定的类有影响 不会影响成员函数或者是父类函数
- 子类对父类扩展函数的影响
open class C
class D : C()
fun C.print() {
println("The print funtion of C.")
}
fun D.print() {
println("The print funtion of D.")
}
fun printC(c: C) {
c.print()
}
var c = C()
var d = D()
c.print()
d.print()
printC(c)
printC(d)
/**
The print funtion of C.
The print funtion of D.
The print funtion of C.
The print funtion of C.
*/
可以看出D并没有重写C的扩展函数方法print,即子类并不会覆盖掉父类的扩展函数
- 扩展方法不会覆盖掉相同的成员方法
class A {
fun ex_print() {
println("I am a member function named ex_print.")
}
}
fun A.ex_print() {
println("I am a extention function named ex_print.")
}
var a = A()
a.ex_print()//打印:I am a member function named ex_print.
3.空的接收器
Any? 关键字,可以接受所有的对象
fun Any?.makeJoke() {
println("Are you kiding me.")
}
var a=A()
a.makeJoke()//任何对象都可以调用
4.扩展属性
var Teather.plus_ten: Int
get() = age + 10
set(value) {
age = value;
}
var t = Teather()
t.plus_ten = 3
println("plus_ten= ${t.plus_ten},age=${t.age}")
//plus_ten= 13,age=3
注意 : 定义属性时 并没有真正赋值给他属性而是只有这个类能使用,而且定义时不能使用这个属性本身
5.友元对象扩展
class Dormitory {
companion object {
fun print() {
println("This is very good of you to take this hand.")
}
}
}
fun Dormitory.Companion.doYou() {
println("Do you like it as you see.")
}
//执行
Dormitory.print()
Dormitory.doYou()
6.扩展范围
当我们在文件中对定义一个扩展方法时,如果想在其他e文件中使用,需要对他的包进行引用。
7.作为成员函数来声明扩展方法
class 内 为其他class 声明扩展方法,注意 内扩展方法并不能直接调用
class E {
fun printE() {
println("This is function printE of E.")
}
//不能通过E直接调用
fun F.extentF() {
print()
printE()
}
fun callF(f: F) {
f.extentF()
}
}
var e = E()
e.printE()
var f = F()
e.callF(f)
f.print();
8.扩展方法的动机
当我们不期望为class 定义所有方法,或者说将一些低频不是必须的方法定义为扩展方法 显得更为合理