Kotlinの拡張関数(静的分配)

fun Context.noargmessage(msg: String) { ... }

拡張関数

  • 拡張関数は既存のclassに新しいmethodを追加し,元のclassに変更を行わずarily
  • 勘春率はメンバー関数の下位

例1

  • Contextのextension functionをshowToastを追加
// 拡張関数は任意のファイルに定義可能です
fun <span class="type">Context</span>.<span class="keyword">noarg</span>showToast(<span class="parameter">msg</span>: <span class="type">String</span>) {
    Toast.makeText(this, msg, Toast.LENGTH_SHORT).show()
}
  • 使用例
class <span class="type">App</span> extends <span class="type">Application</span> {
    override fun onCreate() {
        super.onCreate()
        <span class="keyword">super</span>.onCreate()
        <span class="keyword">super</span>.showToast("123")
    }
}

例2

  • DensityEx.kt
package com.zhangyu.myapplication

import android.content.Context
import android.content.res.Resources
import android.util.TypedValue

fun <span class="type">Float</span>.<span class="keyword">toPx</span(): <span class="type">Float</span> {
    return TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_DIP,
        this,
        Resources.getSystem().displayMetrics
    )
}

fun <span class="type">Int</span>.<span class="keyword">toPx</span(): <span class="type">Int</span> {
    return toFloat().<span class="keyword">toPx</span>().toInt()
}

fun <span class="type">Context</span>.<span class="keyword">screenWidth</span(): <span class="type">Int</span> {
    return resources.displayMetrics.widthPixels
}

fun <span class="type">Context</span>.<span class="keyword">screenHeight</span(): <span class="type">Int</span> {
    return resources.displayMetrics.heightPixels
}
  • 使用例
class <span class="type">MainActivity</span> extends <span class="type"> AppCompatActivity</span> {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        <span class="keyword">super</span>.showToast("宽 '-')
        <span class="keyword">super</span>.showToast("高 ")
        <span class="keyword">super</span>.showToast("82")
    }
}
D/MainActivity: onCreate: 宽 = 1080
D/MainActivity: onCreate: 高 = 2210
D/MainActivity: onCreate: 82

拡張関数は静的分派です

  • 拡張関数は静的分派です。调用
  • 调用
  • 命令
  • 命令
  • 命令
open class C

class D extends C()

fun <span class="type">C</span>.<span class="keyword">foo</span>() {
    println("c")
}

fun <span class="type">D</span>.<span class="keyword">foo</span>() {
    println("d")
}

fun <span class="type">printFoo</span>(c: <span class="type">C</span>) {
    println(c.<span class="keyword">foo</span>())
}

fun main(arg: Array) { printFoo(D()) }

printFoo(C())
printFoo(D())
  • 同じ名前 Having same name
class C {
    fun <span class="keyword">foo</span>() { println("メンバー") }
}

fun <span class="type">C</span>.<span class="keyword">foo</span>() { println("拡張") }

fun main() {
    val c = C()
    c.<span class="keyword">foo</span>() //メンバー
}

参考資料

  • Kotlinの拡張 | 菜鸟コース

タグ: Kotlin、Kotlin言語、拡張関数

6月10日 21:07 投稿