Kotlin扩展函数

摘自官网解释:

Kotlin 可以对一个类的属性和方法进行扩展,且不需要继承或使用 Decorator 模式

扩展是一种静态行为,对被扩展的类代码本身不会造成任何影响

扩展函数

fun receiverType.functionName(params){
    body
}
fun Float.toPx(): Float {
    return TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_DIP,
        this,
        Resources.getSystem().displayMetrics
    )
}

注:创建这样一个kt文件,按照以上这个方式写出来的方法,是属于receiverType这个类吗?不是的,它不属于任何一个类,是一个顶层函数Top-level Function,属于所在的包。为什么能够被receiverType的对象调用呢?实际是限定了扩展函数只有通过receiverType类型才能调用。

成员扩展函数

class Exp {
    fun String.method() {
        println("---->>>")
    }

    fun startTest() {
        "test".method()
    }
}

注:这种成员的扩展函数,调用范围只能在这个类的内部,外部不能调用

扩展属性

val Float.dp
    get() = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this, Resources.getSystem().displayMetrics)

注:扩展属性只能被声明为 val,不允许被初始化,只能由显式提供的 getter/setter 定义。

扩展函数是静态解析

在kotlin中扩展是静态分发的,不是根据接收者类型的虚方法。也就是说调用扩展函数是由调用所在的表达式类型来决定的,而不是由表达式运行时求值结果决定的。例如:

open class C

class D: C()

fun C.name() = "cName"   // 扩展函数 foo

fun D.name() = "dName"   // 扩展函数 foo

fun printFoo(c: C) {
    println(c.name())  // 类型是 C 类
}

fun main(arg:Array<String>){
    printFoo(D())
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ezview_uniview

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值