在 Kotlin 中, 提供了一个很方便的功能,可以在不继承父类,也不使用类似装饰器这样的设计模式的情况下对指定类进行扩展,扩展新的方法、属性。
扩展方法
用法:类名.方法名
例子
1 | fun Context.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT) { |
然后 Context 及其子类 都可以使用 toast
方法了,duration
是默认参数,不传值的话默认为 Toast.LENGTH_SHORT
1 | toast("Hello world!") |
给一个类扩展方法并 不会修改原来的类 ,Kotlin 只不过让类的实例可以通过 .
来调用这个方法
这个方法是 静态添加上的,并不会在运行时改变。什么意思呢,看下面的例子:
1 | open class C |
我们声明了参数类型为 C ,那么 printFoo
方法内直接调用的就是 C 类的 **foo()**。而 D() 是具体运行时传入的,扩展函数内调用的还是 C 的方法。
当定义的扩展方法这个类已经存在了同名的扩展方法,这时候是怎么运行的呢? 看下面的例子:
1 | class C { |
当我们调用 c.foo()
, 将会输出 “member”, 而不是 “extension”, 很明显,类内部定义的方法优先 。
扩展属性
用法:类名.属性名
例如
1 | val View.ctx: Context |
这样 View及其子类 都拥有了 ctx
属性。
Kotlin for Android 常用的扩展
下面总结一些 Android 中比较常用的扩展。注意是对哪些类进行的扩展。
1 |
|
其他资源
更多详细用法,查看官网文档
Kotlin 资源汇总
文章来自: https://hanks.pub