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の拡張 | 菜鸟コース