如何使用 Nested 和 Inner Classes

如何使用 Nested 和 Inner Classes

如果你有一個類別宣告後,裡面又宣告一個類別,就稱作 Nested class。

說明

一個基本的用法如下。

class Outer {
    private val bar: Int = 1
    class Nested {
        fun foo() = 2
    }
}
val demo = Outer.Nested().foo() // == 2

所以當你要呼叫 foo 就必須透過 Outer 物件內的 Nested 物件呼叫。

但是如果你要在 foo 內呼叫外層的成員變數的話,是無法呼叫的。

class Outer {
    private val bar: Int = 1
    class Nested {
        fun foo() {
            println("bar:$bar") // unresolved reference: bar
        }
    }
}

Inner classes

再把剛剛的例子拿出來看,如果我們換成 inner class 的情況,就可以存取 Outter class 了。

class Outer {
    private val bar: Int = 1
    inner class Inner {
        fun foo() = bar
    }
}

val demo = Outer().Inner().foo() // == 1

Anonymous inner classes

你也可以使用 object 來實作 Anonymous inner classes

window.addMouseListener(object : MouseAdapter() {

    override fun mouseClicked(e: MouseEvent) { ... }

    override fun mouseEntered(e: MouseEvent) { ... }
})

參考資料

https://kotlinlang.org/docs/reference/nested-classes.html