初心者用kotlin

kotlinのメモです。

735 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。
仮想通貨はNEMが好き。
水耕栽培は激辛好きが高じて、キャロライナ・リーパーの栽培にチャレンジ中。

サイト/ブログ

https://www.osumoi-stdio.com/pyarticle/

ツイッター

@darkimpact0626