kotlinのメモです。
956 views
あるサンプルプログラムにこういうコードがあった。
val imageSavedCB = object : ImageCapture.OnImageSavedCallback {
override fun onImageSaved(outputFileResults) {
Toast.makeText(applicationContext, "save to file", Toast.LENGTH_LONG).show()
}
override fun onError(exception: ImageCaptureException) {
}
}
いまいち意味がわからなかったので、調べた。
kotlinにはオブジェクト式という考え方があることを知らなかったことが原因。
javaで言うところの無名クラスと似たようなものである。
まずは、オブジェクト式の基礎から。
fun main(args:Array<String>) {
//オブジェクト式の基本
val o = object {
var x: Int = 0
var y: Int = 100
}
println(o.x)
println(o.y)
3行目から6行目の以下の部分で、無名のクラスを定義している。
そのクラスがo変数に代入されている、という意味になる。
つまるところ、本来なら以下のように書くべきだけど、MyClassをわざわざ定義せずに、省略した書き方もできるということである。
class MyClass {
var x: Int = 0
var y: Int = 100
}
fun main(args:Array<String>) {
val o = MyClass()
println(o.x)
println(o.y)
}
次に、お題の以下の部分について。
object : ImageCapture.OnImageSavedCallback {
override fun onImageSaved(outputFileResults) {
Toast.makeText(applicationContext, "save to file", Toast.LENGTH_LONG).show()
}
override fun onError(exception: ImageCaptureException) {
}
}
何をやっているのかというと、ImageCapture.OnImageSavedCallbackというinterfaceを無名クラスが継承している、ということを意味したコードである。
超簡略化したコードは以下。
interface ImgInterface {
fun onError()
fun onSaved()
}
fun main(args:Array<String>) {
val o1 = object:ImgInterface {
override fun onError() {
println("Call OnError")
}
override fun onSaved() {
print("Call OnSaved")
}
}
o1.onError()
o1.onSaved()
}
1行目~4行目はImgInrerfaceという名前のインターフェースである。
それを、無名クラスのobjectが継承している、というのが7行目。
そして、そのまま、interfaceのメソッドをオーバーライドしている、というもの。
中身がわかれば怖くない。
けどなぁ、初学者にはちょっとしんどいコードだよねぇ。
Page 28 of 36.
すぺぺぺ
本サイトの作成者。
プログラムは趣味と勉強を兼ねて、のんびり本サイトを作っています。
フレームワークはdjango。
ChatGPTで自動プログラム作成に取り組み中。
https://www.osumoi-stdio.com/novel/