Kotlin入门(五):扩展属性,函数(笔记)

Kotlin中可以扩展原始类型的函数和属性,原始类型称为“接受类型”.

扩展函数

在接收类型上添加扩展函数,语法如下:

fun 接收类型.函数名(参数列表) : 返回值类型 {
函数体
return 返回值
}

看完语法,撸代码:

class Student {
    constructor(name: String, age: Int) {
        this.name = name
        this.age = age
    }
    var name: String = ""
    var age: Int = 0
}
//拓展函数
fun Student.desc(): String {
    return "name : ${this.name} ,age : ${this.age}"
}
fun main(args: Array) {
    val student =Student("Rose",20)

    println(student.desc())
}

输出结果:


4.png

通过对Student对象进行函数的拓展,在初始化完成进行拓展函数的调用,则可实现控制台的输出结果,这样的方式可以避免通过继承的方式拓展多余的功能!方便,还节省了代码的编写!

扩展属性

在接收类型上添加拓展属性,具体语法如下:

var|val 接收类型.属性名称 [:数据类型 ]
[getter 访问器]
[settter 访问器]

可扩展属性与普通属性在声明是的区别就是在属性名前边加上“接收类型”。接收数据类型可以是任意kotlin数据类型,包括基本数据类型和引用类型。

class Student {
    constructor(name: String, age: Int) {
        this.name = name
        this.age = age
    }
    var name: String = ""
    var age: Int = 0
}
//拓展属性
var Student.desc: String
    get() = "{Student: [ name = ${this.name} ,age=${this.age}]}"
    set(value) {
        println(value)
    }
fun main(args: Array) {
    val student = Student("Rose", 20)
    println(student.desc)
}

运行代码结果:


5.png

通过代码和运行结果可以看出定义了Student对象desc属性,在main方法中,初始化对象并调用去拓展属性,得到了我们预期的效果!

成员优先原则

无论是拓展属性还是拓展函数,如果接收类型成员中已经有相同的属性或者函数,那么在调用属性和函数时,始终是调用接收类型的成员属性和函数,这就是“成员优先”原则。
示例代码:

class Student {
    constructor(name: String, age: Int) {
        this.name = name
        this.age = age
    }
    var name: String = ""
    var age: Int = 0

    //成员属性
    var desc:String ="成员 :{Student: [ name = ${this.name} ,age=${this.age}]}"

    //成员函数
    fun desc(): String {
        return "成员:name : ${this.name} ,age : ${this.age}"
    }
}

//扩展属性
var Student.desc: String
    get() = "扩展 :{Student: [ name = ${this.name} ,age=${this.age}]}"
    set(value) {
        println(value)
    }
//扩展函数
fun Student.desc(): String {
    return "扩展:name : ${this.name} ,age : ${this.age}"
}
//扩展函数
fun Student.descs(): String {
    return "扩展:name : ${this.name} ,age : ${this.age}"
}

fun main(args: Array) {
    val student = Student("Rose", 20)
    println(student.desc)
    println(student.desc())
    println(student.descs())
}

运行代码结果:


6.png

由上边运行结果可以看出,对象调用了desc()/desc (成员函数(属性),扩展函数(属性)),输出结果是成员属性(函数)的执行结果,而descs()是扩展函数,在成员函数中不存在,则结果是扩展函数的结果!由此看出在成员属性(函数),扩展属性(函数)相同情况下,履行成员优先的原则!

你可能感兴趣的:(Kotlin入门(五):扩展属性,函数(笔记))