扩展函数
- 扩展函数可以在已有类中添加新的方法,不会对原类做修改
举例1
- 对Context进行扩展showToast方法,可以在Fragment、Activity、Application中弹出Toast,showToast的定义可以写在任何文件中
fun Context.showToast(msg: String) { Toast.makeText(this, msg, Toast.LENGTH_SHORT).show() }
class App : Application() { override fun onCreate() { super.onCreate() showToast("123") } }
举例2
package com.zhangyu.myapplication import android.content.Context import android.content.res.Resources import android.util.TypedValue fun Float.toPx(): Float { return TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, this, Resources.getSystem().displayMetrics ) } fun Int.toPx():Int{ return toFloat().toPx().toInt() } fun Context.screenWidth(): Int { return resources.displayMetrics.widthPixels } fun Context.screenHeight(): Int { return resources.displayMetrics.heightPixels }
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) Log.d(TAG, "onCreate: screenWidth=${screenWidth()}") Log.d(TAG, "onCreate: screenHeight=${screenHeight()}") Log.d(TAG, "onCreate: ${30.toPx()}") } }
D/MainActivity: onCreate: screenWidth=1080 D/MainActivity: onCreate: screenHeight=2210 D/MainActivity: onCreate: 82
扩展函数是静态解析的
- 扩展函数是静态解析的,并不是接收者类型的虚拟成员,在调用扩展函数时,具体被调用的的是哪一个函数,由调用函数的的对象表达式来决定的,而不是动态的类型决定的。
open class C class D: C() fun C.foo() = "c" fun D.foo() = "d" fun printFoo(c: C) { println(c.foo()) } fun main(arg:Array<String>){ printFoo(D()) }
- 若扩展函数和成员函数一致,则使用该函数时,会优先使用成员函数。
class C { fun foo() { println("成员函数") } } fun C.foo() { println("扩展函数") } fun main(arg:Array<String>){ var c = C() c.foo() }
参考资料