扩展方法 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 定义所有方法,或者说将一些低频不是必须的方法定义为扩展方法 显得更为合理

results matching ""

    No results matching ""